├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── dependabot.yml └── workflows │ ├── build.yml │ ├── codeql.yml │ ├── docs.yml │ ├── release.yml │ ├── snapshot.yml │ └── test.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── build.gradle.kts ├── buildSrc ├── .gitignore ├── build.gradle.kts ├── settings.gradle.kts └── src │ └── main │ └── kotlin │ ├── AndroidLibrary.kt │ ├── Configuration.kt │ ├── Publication.kt │ └── utils │ ├── ProjectExtensions.kt │ └── Property.kt ├── core ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── androidTest │ ├── AndroidManifest.xml │ └── java │ │ └── io │ │ └── github │ │ └── thibaultbee │ │ └── streampack │ │ └── core │ │ ├── elements │ │ ├── encoders │ │ │ ├── AudioCodecConfigTest.kt │ │ │ └── VideoCodecConfigTest.kt │ │ ├── endpoints │ │ │ ├── DummyEndpoint.kt │ │ │ ├── EndpointStateTest.kt │ │ │ ├── MediaMuxerEndpointTest.kt │ │ │ └── composites │ │ │ │ └── sinks │ │ │ │ └── SinkStateTest.kt │ │ └── sources │ │ │ ├── StubAudioSource.kt │ │ │ └── StubVideoSource.kt │ │ ├── pipelines │ │ ├── StreamerPipelineFileTest.kt │ │ ├── StreamerPipelineTest.kt │ │ ├── outputs │ │ │ ├── StubPipelineOutput.kt │ │ │ └── encoding │ │ │ │ └── EncodingPipelineOutputTest.kt │ │ └── utils │ │ │ └── SourceConfigUtilsTest.kt │ │ ├── streamer │ │ ├── dual │ │ │ ├── file │ │ │ │ └── CameraDualStreamerFileTest.kt │ │ │ └── utils │ │ │ │ └── DualStreamerConfigUtils.kt │ │ ├── single │ │ │ ├── file │ │ │ │ ├── CameraSingleStreamerFileTest.kt │ │ │ │ └── CameraSingleStreamerMultiEndpointTest.kt │ │ │ ├── state │ │ │ │ ├── AudioOnlySingleStreamerStateTest.kt │ │ │ │ ├── CameraSingleStreamerStateTest.kt │ │ │ │ └── SingleStreamerStateTest.kt │ │ │ └── utils │ │ │ │ └── SingleStreamerConfigUtils.kt │ │ ├── surface │ │ │ ├── SurfaceUtils.kt │ │ │ └── SurfaceViewTestActivity.kt │ │ └── utils │ │ │ ├── DeviceTest.kt │ │ │ ├── StreamerUtils.kt │ │ │ └── VideoUtils.kt │ │ └── utils │ │ ├── FileUtils.kt │ │ └── SurfaceUtils.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── io │ │ │ └── github │ │ │ └── thibaultbee │ │ │ └── streampack │ │ │ └── core │ │ │ ├── configuration │ │ │ ├── BitrateRegulatorConfig.kt │ │ │ └── mediadescriptor │ │ │ │ ├── CustomDataUtils.kt │ │ │ │ ├── MediaDescriptor.kt │ │ │ │ └── UriMediaDescriptor.kt │ │ │ ├── elements │ │ │ ├── data │ │ │ │ ├── Frame.kt │ │ │ │ ├── Packet.kt │ │ │ │ └── SrtPacket.kt │ │ │ ├── encoders │ │ │ │ ├── AudioCodecConfig.kt │ │ │ │ ├── CodecConfig.kt │ │ │ │ ├── IEncoder.kt │ │ │ │ ├── VideoCodecConfig.kt │ │ │ │ └── mediacodec │ │ │ │ │ ├── EncoderConfig.kt │ │ │ │ │ ├── EncoderInfo.kt │ │ │ │ │ ├── MediaCodecEncoder.kt │ │ │ │ │ ├── MediaCodecHelper.kt │ │ │ │ │ ├── MediaCodecUtils.kt │ │ │ │ │ └── extensions │ │ │ │ │ └── BufferInfoExtensions.kt │ │ │ ├── endpoints │ │ │ │ ├── CombineEndpoint.kt │ │ │ │ ├── DualEndpoint.kt │ │ │ │ ├── DynamicEndpoint.kt │ │ │ │ ├── DynamicLocalEndpoint.kt │ │ │ │ ├── IEndpoint.kt │ │ │ │ ├── MediaContainerType.kt │ │ │ │ ├── MediaMuxerEndpoint.kt │ │ │ │ ├── MediaSinkType.kt │ │ │ │ └── composites │ │ │ │ │ ├── CompositeEndpoint.kt │ │ │ │ │ ├── CompositeEndpoints.kt │ │ │ │ │ ├── ICompositeEndpointInternal.kt │ │ │ │ │ ├── muxers │ │ │ │ │ ├── IMuxerInternal.kt │ │ │ │ │ ├── flv │ │ │ │ │ │ ├── FlvMuxer.kt │ │ │ │ │ │ ├── FlvMuxerInfo.kt │ │ │ │ │ │ ├── amf │ │ │ │ │ │ │ ├── AmfParameter.kt │ │ │ │ │ │ │ ├── containers │ │ │ │ │ │ │ │ ├── AmfContainer.kt │ │ │ │ │ │ │ │ ├── AmfEcmaArray.kt │ │ │ │ │ │ │ │ └── AmfObject.kt │ │ │ │ │ │ │ └── primitives │ │ │ │ │ │ │ │ ├── AmfBoolean.kt │ │ │ │ │ │ │ │ ├── AmfInt16.kt │ │ │ │ │ │ │ │ ├── AmfInt24.kt │ │ │ │ │ │ │ │ ├── AmfInt32.kt │ │ │ │ │ │ │ │ ├── AmfNamedParameter.kt │ │ │ │ │ │ │ │ ├── AmfNull.kt │ │ │ │ │ │ │ │ ├── AmfNumber.kt │ │ │ │ │ │ │ │ └── AmfString.kt │ │ │ │ │ │ └── tags │ │ │ │ │ │ │ ├── AVTagsFactory.kt │ │ │ │ │ │ │ ├── AudioTag.kt │ │ │ │ │ │ │ ├── FlvHeader.kt │ │ │ │ │ │ │ ├── FlvTag.kt │ │ │ │ │ │ │ ├── OnMetadata.kt │ │ │ │ │ │ │ └── video │ │ │ │ │ │ │ ├── ExtendedVideoTag.kt │ │ │ │ │ │ │ ├── VideoTag.kt │ │ │ │ │ │ │ └── VideoTagFactory.kt │ │ │ │ │ ├── mp4 │ │ │ │ │ │ ├── Mp4Muxer.kt │ │ │ │ │ │ ├── Mp4MuxerInfo.kt │ │ │ │ │ │ ├── boxes │ │ │ │ │ │ │ ├── AV1CodecConfigurationBox.kt │ │ │ │ │ │ │ ├── AVCConfigurationBox.kt │ │ │ │ │ │ │ ├── BitRateBox.kt │ │ │ │ │ │ │ ├── Box.kt │ │ │ │ │ │ │ ├── ChunkOffsetBox.kt │ │ │ │ │ │ │ ├── CleanApertureBox.kt │ │ │ │ │ │ │ ├── DataEntryBox.kt │ │ │ │ │ │ │ ├── DataInformationBox.kt │ │ │ │ │ │ │ ├── DataReferenceBox.kt │ │ │ │ │ │ │ ├── ESDSBox.kt │ │ │ │ │ │ │ ├── FileTypeBox.kt │ │ │ │ │ │ │ ├── HEVCConfigurationBox.kt │ │ │ │ │ │ │ ├── HandlerBox.kt │ │ │ │ │ │ │ ├── MediaBox.kt │ │ │ │ │ │ │ ├── MediaDataBox.kt │ │ │ │ │ │ │ ├── MediaHeaderBox.kt │ │ │ │ │ │ │ ├── MediaInformationBox.kt │ │ │ │ │ │ │ ├── MovieBox.kt │ │ │ │ │ │ │ ├── MovieExtendsBox.kt │ │ │ │ │ │ │ ├── MovieFragmentBox.kt │ │ │ │ │ │ │ ├── MovieFragmentHeaderBox.kt │ │ │ │ │ │ │ ├── MovieFragmentRandomAccessBox.kt │ │ │ │ │ │ │ ├── MovieFragmentRandomAccessOffsetBox.kt │ │ │ │ │ │ │ ├── MovieHeaderBox.kt │ │ │ │ │ │ │ ├── NullMediaHeaderBox.kt │ │ │ │ │ │ │ ├── OpusSpecificBox.kt │ │ │ │ │ │ │ ├── PixelAspectRatioBox.kt │ │ │ │ │ │ │ ├── SampleDescriptionBox.kt │ │ │ │ │ │ │ ├── SampleEntry.kt │ │ │ │ │ │ │ ├── SampleSizeBox.kt │ │ │ │ │ │ │ ├── SampleTableBox.kt │ │ │ │ │ │ │ ├── SampleToChunkBox.kt │ │ │ │ │ │ │ ├── SyncSampleBox.kt │ │ │ │ │ │ │ ├── TimeToSampleBox.kt │ │ │ │ │ │ │ ├── TrackBox.kt │ │ │ │ │ │ │ ├── TrackExtendsBox.kt │ │ │ │ │ │ │ ├── TrackFragmentBaseMediaDecodeTimeBox.kt │ │ │ │ │ │ │ ├── TrackFragmentBox.kt │ │ │ │ │ │ │ ├── TrackFragmentHeaderBox.kt │ │ │ │ │ │ │ ├── TrackFragmentRandomAccessBox.kt │ │ │ │ │ │ │ ├── TrackHeaderBox.kt │ │ │ │ │ │ │ ├── TrackRunBox.kt │ │ │ │ │ │ │ ├── TypeMediaHeaderBox.kt │ │ │ │ │ │ │ └── VPCodecConfigurationBox.kt │ │ │ │ │ │ ├── models │ │ │ │ │ │ │ ├── Chunk.kt │ │ │ │ │ │ │ ├── MovieBoxFactory.kt │ │ │ │ │ │ │ ├── SampleFlags.kt │ │ │ │ │ │ │ ├── Segment.kt │ │ │ │ │ │ │ ├── Segmenter.kt │ │ │ │ │ │ │ ├── SegmenterFactory.kt │ │ │ │ │ │ │ ├── Track.kt │ │ │ │ │ │ │ └── TrackChunks.kt │ │ │ │ │ │ └── utils │ │ │ │ │ │ │ ├── CodecConfigExtensions.kt │ │ │ │ │ │ │ └── TimeUtils.kt │ │ │ │ │ └── ts │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── TsMuxer.kt │ │ │ │ │ │ ├── TsMuxerInfo.kt │ │ │ │ │ │ ├── data │ │ │ │ │ │ ├── ITSElement.kt │ │ │ │ │ │ ├── Service.kt │ │ │ │ │ │ ├── Stream.kt │ │ │ │ │ │ └── TSServiceInfo.kt │ │ │ │ │ │ ├── descriptors │ │ │ │ │ │ └── AdaptationField.kt │ │ │ │ │ │ ├── packets │ │ │ │ │ │ ├── Pat.kt │ │ │ │ │ │ ├── Pes.kt │ │ │ │ │ │ ├── PesHeader.kt │ │ │ │ │ │ ├── Pmt.kt │ │ │ │ │ │ ├── Psi.kt │ │ │ │ │ │ ├── Sdt.kt │ │ │ │ │ │ ├── TS.kt │ │ │ │ │ │ └── TableHeader.kt │ │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CRC32.kt │ │ │ │ │ │ ├── MuxerConst.kt │ │ │ │ │ │ ├── TSConst.kt │ │ │ │ │ │ ├── TSOutputCallback.kt │ │ │ │ │ │ └── av │ │ │ │ │ │ └── OpusControlHeader.kt │ │ │ │ │ └── sinks │ │ │ │ │ ├── AbstractSink.kt │ │ │ │ │ ├── ChunkedFileOutputStreamSink.kt │ │ │ │ │ ├── ClosedException.kt │ │ │ │ │ ├── ContentSink.kt │ │ │ │ │ ├── FakeSink.kt │ │ │ │ │ ├── FileSink.kt │ │ │ │ │ ├── ISink.kt │ │ │ │ │ ├── OutputStreamSink.kt │ │ │ │ │ └── SinkConfiguration.kt │ │ │ ├── interfaces │ │ │ │ └── Streamable.kt │ │ │ ├── processing │ │ │ │ ├── IFrameProcessor.kt │ │ │ │ ├── RawFramePullPush.kt │ │ │ │ ├── audio │ │ │ │ │ ├── AudioEffects.kt │ │ │ │ │ ├── AudioFrameProcessor.kt │ │ │ │ │ └── IAudioFrameProcessor.kt │ │ │ │ └── video │ │ │ │ │ ├── ISurfaceProcessor.kt │ │ │ │ │ ├── OpenGlRenderer.kt │ │ │ │ │ ├── ShaderProvider.kt │ │ │ │ │ ├── SurfaceProcessor.kt │ │ │ │ │ ├── outputs │ │ │ │ │ ├── AbstractSurfaceOutput.kt │ │ │ │ │ ├── SurfaceOutput.kt │ │ │ │ │ └── ViewPortUtils.kt │ │ │ │ │ ├── source │ │ │ │ │ ├── DefaultSourceInfoProvider.kt │ │ │ │ │ └── ISourceInfoProvider.kt │ │ │ │ │ └── utils │ │ │ │ │ ├── GLUtils.kt │ │ │ │ │ ├── GraphicDeviceInfo.kt │ │ │ │ │ ├── OutputSurface.kt │ │ │ │ │ ├── TransformUtils.kt │ │ │ │ │ └── extensions │ │ │ │ │ ├── FloatExtensions.kt │ │ │ │ │ ├── IntExtensions.kt │ │ │ │ │ ├── RectFExtensions.kt │ │ │ │ │ └── SizeExtensions.kt │ │ │ ├── sources │ │ │ │ ├── IMediaProjectionSource.kt │ │ │ │ ├── audio │ │ │ │ │ ├── AudioSourceConfig.kt │ │ │ │ │ ├── IAudioFrameSourceInternal.kt │ │ │ │ │ ├── IAudioSource.kt │ │ │ │ │ └── audiorecord │ │ │ │ │ │ ├── AudioRecordEffect.kt │ │ │ │ │ │ ├── AudioRecordSource.kt │ │ │ │ │ │ ├── IAudioRecordSource.kt │ │ │ │ │ │ ├── MediaProjectionAudioSource.kt │ │ │ │ │ │ └── MicrophoneSource.kt │ │ │ │ └── video │ │ │ │ │ ├── AbstractPreviewableSource.kt │ │ │ │ │ ├── IPreviewableSource.kt │ │ │ │ │ ├── ISurfaceSourceInternal.kt │ │ │ │ │ ├── IVideoFrameSource.kt │ │ │ │ │ ├── IVideoSource.kt │ │ │ │ │ ├── VideoSourceConfig.kt │ │ │ │ │ ├── bitmap │ │ │ │ │ ├── BitmapSource.kt │ │ │ │ │ └── IBitmapSource.kt │ │ │ │ │ ├── camera │ │ │ │ │ ├── CameraException.kt │ │ │ │ │ ├── CameraInfoProvider.kt │ │ │ │ │ ├── CameraSettings.kt │ │ │ │ │ ├── CameraSource.kt │ │ │ │ │ ├── CameraSourceFactory.kt │ │ │ │ │ ├── ICameraSource.kt │ │ │ │ │ ├── controllers │ │ │ │ │ │ ├── CameraController.kt │ │ │ │ │ │ ├── CameraDeviceController.kt │ │ │ │ │ │ └── CameraSessionController.kt │ │ │ │ │ ├── extensions │ │ │ │ │ │ ├── CameraManagerExtensionsForCamera.kt │ │ │ │ │ │ └── ContextExtensionsForCamera.kt │ │ │ │ │ ├── sessioncompat │ │ │ │ │ │ ├── CameraCaptureSessionCompatBuilder.kt │ │ │ │ │ │ ├── CameraExecutorCaptureSessionCompat.kt │ │ │ │ │ │ ├── CameraHandlerCaptureSessionCompat.kt │ │ │ │ │ │ └── ICameraCaptureSessionCompat.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CameraOrientationUtils.kt │ │ │ │ │ │ ├── CameraSizes.kt │ │ │ │ │ │ ├── CameraTimestampHelper.kt │ │ │ │ │ │ └── CameraUtils.kt │ │ │ │ │ └── mediaprojection │ │ │ │ │ └── MediaProjectionVideoSource.kt │ │ │ └── utils │ │ │ │ ├── Annotations.kt │ │ │ │ ├── ChunkedFileOutputStream.kt │ │ │ │ ├── ConflatedJob.kt │ │ │ │ ├── DerivedStateFlow.kt │ │ │ │ ├── ListUtils.kt │ │ │ │ ├── OrientationUtils.kt │ │ │ │ ├── Scheduler.kt │ │ │ │ ├── TimeUtils.kt │ │ │ │ ├── WindowUtils.kt │ │ │ │ ├── av │ │ │ │ ├── FourCC.kt │ │ │ │ ├── audio │ │ │ │ │ ├── AudioObjectType.kt │ │ │ │ │ ├── AudioSpecificConfig.kt │ │ │ │ │ ├── ChannelConfiguration.kt │ │ │ │ │ ├── SamplingFrequencyIndex.kt │ │ │ │ │ ├── aac │ │ │ │ │ │ ├── AACFrameWriter.kt │ │ │ │ │ │ ├── ADTS.kt │ │ │ │ │ │ ├── AudioMuxElement.kt │ │ │ │ │ │ ├── ProgramConfigElement.kt │ │ │ │ │ │ └── config │ │ │ │ │ │ │ ├── ELDSpecificConfig.kt │ │ │ │ │ │ │ ├── GASpecificConfig.kt │ │ │ │ │ │ │ ├── SbrHeader.kt │ │ │ │ │ │ │ └── SpecificConfig.kt │ │ │ │ │ └── opus │ │ │ │ │ │ ├── IdentificationHeader.kt │ │ │ │ │ │ └── OpusCsdParser.kt │ │ │ │ ├── buffer │ │ │ │ │ ├── BitBuffer.kt │ │ │ │ │ ├── BitBufferWriter.kt │ │ │ │ │ ├── ByteBufferReader.kt │ │ │ │ │ └── ByteBufferWriter.kt │ │ │ │ ├── descriptors │ │ │ │ │ ├── AudioSpecificConfigDescriptor.kt │ │ │ │ │ ├── BaseDescriptor.kt │ │ │ │ │ ├── DecoderConfigDescriptor.kt │ │ │ │ │ ├── DecoderSpecificInfo.kt │ │ │ │ │ ├── ESDescriptor.kt │ │ │ │ │ ├── SLConfigDescriptor.kt │ │ │ │ │ └── Tags.kt │ │ │ │ └── video │ │ │ │ │ ├── DynamicRangeProfile.kt │ │ │ │ │ ├── H26X.kt │ │ │ │ │ ├── H26XBitBuffer.kt │ │ │ │ │ ├── av1 │ │ │ │ │ └── AV1CodecConfigurationRecord.kt │ │ │ │ │ ├── avc │ │ │ │ │ └── AVCDecoderConfigurationRecord.kt │ │ │ │ │ ├── hevc │ │ │ │ │ ├── HEVCDecoderConfigurationRecord.kt │ │ │ │ │ ├── HEVCParameterSets.kt │ │ │ │ │ └── HEVCProfile.kt │ │ │ │ │ └── vpx │ │ │ │ │ ├── ChromaSubsampling.kt │ │ │ │ │ ├── ColorPrimaries.kt │ │ │ │ │ ├── Level.kt │ │ │ │ │ ├── MatrixCoefficients.kt │ │ │ │ │ ├── Profile.kt │ │ │ │ │ ├── TransferCharacteristics.kt │ │ │ │ │ ├── VP9CodecPrivate.kt │ │ │ │ │ └── VPCodecConfigurationRecord.kt │ │ │ │ ├── extensions │ │ │ │ ├── AudioEffectExtensions.kt │ │ │ │ ├── BitOperationExtensions.kt │ │ │ │ ├── ByteBufferExtensions.kt │ │ │ │ ├── CancellableContinuationExtensions.kt │ │ │ │ ├── ConfigExtensions.kt │ │ │ │ ├── ContextExtensions.kt │ │ │ │ ├── Extensions.kt │ │ │ │ ├── IEndpointInfoExtensions.kt │ │ │ │ ├── IntExtensions.kt │ │ │ │ ├── ListExtensions.kt │ │ │ │ ├── MediaFormatExtensions.kt │ │ │ │ ├── RectExtensions.kt │ │ │ │ ├── SharedFlowExtensions.kt │ │ │ │ ├── SizeExtensions.kt │ │ │ │ ├── StringExtensions.kt │ │ │ │ └── ThrowableExtensions.kt │ │ │ │ └── pool │ │ │ │ ├── ByteBufferPool.kt │ │ │ │ ├── IBufferPool.kt │ │ │ │ ├── IFrameFactory.kt │ │ │ │ └── RawFrameFactory.kt │ │ │ ├── interfaces │ │ │ ├── ISource.kt │ │ │ └── IStreamer.kt │ │ │ ├── logger │ │ │ ├── ILogger.kt │ │ │ ├── Logger.kt │ │ │ └── StreamPackLogger.kt │ │ │ ├── pipelines │ │ │ ├── StreamerPipeline.kt │ │ │ ├── inputs │ │ │ │ ├── AudioInput.kt │ │ │ │ └── VideoInput.kt │ │ │ ├── outputs │ │ │ │ ├── IPipelineOutput.kt │ │ │ │ └── encoding │ │ │ │ │ ├── EncodingPipelineOutput.kt │ │ │ │ │ └── IEncodingPipelineOutput.kt │ │ │ └── utils │ │ │ │ └── SourceConfigUtils.kt │ │ │ ├── regulator │ │ │ ├── BitrateRegulator.kt │ │ │ ├── IBitrateRegulator.kt │ │ │ └── controllers │ │ │ │ ├── BitrateRegulatorController.kt │ │ │ │ ├── DummyBitrateRegulatorController.kt │ │ │ │ └── IBitrateRegulatorController.kt │ │ │ ├── streamers │ │ │ ├── IConfigurableStreamer.kt │ │ │ ├── dual │ │ │ │ ├── DualStreamer.kt │ │ │ │ ├── IDualStreamer.kt │ │ │ │ └── VideoOnlyDualStreamer.kt │ │ │ ├── extensions │ │ │ │ └── StreamerExtensions.kt │ │ │ ├── infos │ │ │ │ ├── CameraStreamerConfigurationInfo.kt │ │ │ │ ├── IConfigurationInfo.kt │ │ │ │ └── StreamerConfigurationInfo.kt │ │ │ ├── lifecycle │ │ │ │ ├── StreamerActivityLifeCycleObserver.kt │ │ │ │ └── StreamerViewModelLifeCycleObserver.kt │ │ │ ├── orientation │ │ │ │ ├── DisplayRotationProvider.kt │ │ │ │ ├── RotationFlowProvider.kt │ │ │ │ ├── RotationProvider.kt │ │ │ │ └── SensorRotationProvider.kt │ │ │ ├── single │ │ │ │ ├── AudioOnlySingleStreamer.kt │ │ │ │ ├── ISingleStreamer.kt │ │ │ │ ├── SingleStreamer.kt │ │ │ │ └── VideoOnlySingleStreamer.kt │ │ │ └── utils │ │ │ │ └── ScreenRecorder.kt │ │ │ └── utils │ │ │ └── extensions │ │ │ ├── ContextExtensions.kt │ │ │ └── ThrowableExtensions.kt │ └── res │ │ ├── drawable │ │ └── ic_baseline_linked_camera_24.xml │ │ └── values │ │ └── strings.xml │ └── test │ ├── java │ └── io │ │ └── github │ │ └── thibaultbee │ │ └── streampack │ │ └── core │ │ └── elements │ │ ├── endpoints │ │ ├── DynamicEndpointTest.kt │ │ └── composites │ │ │ ├── muxers │ │ │ ├── flv │ │ │ │ ├── amf │ │ │ │ │ ├── containers │ │ │ │ │ │ └── AmfEcmaArrayTest.kt │ │ │ │ │ └── primitives │ │ │ │ │ │ ├── AmfBooleanTest.kt │ │ │ │ │ │ ├── AmfInt32Test.kt │ │ │ │ │ │ ├── AmfNamedParameterTest.kt │ │ │ │ │ │ └── AmfStringTest.kt │ │ │ │ └── tags │ │ │ │ │ └── OnMetadataTest.kt │ │ │ ├── mp4 │ │ │ │ ├── MP4ResourcesUtils.kt │ │ │ │ └── boxes │ │ │ │ │ ├── AVCConfigurationBoxTest.kt │ │ │ │ │ ├── AVCSampleEntryTest.kt │ │ │ │ │ ├── BitRateBoxTest.kt │ │ │ │ │ ├── ChunkOffsetBoxTest.kt │ │ │ │ │ ├── DataInformationBoxTest.kt │ │ │ │ │ ├── DataReferenceBoxTest.kt │ │ │ │ │ ├── FileTypeBoxTest.kt │ │ │ │ │ ├── HEVCConfigurationBoxTest.kt │ │ │ │ │ ├── HEVCSampleEntryTest.kt │ │ │ │ │ ├── HandlerBoxTest.kt │ │ │ │ │ ├── MP4AudioSampleEntryTest.kt │ │ │ │ │ ├── MovieFragmentHeaderBoxTest.kt │ │ │ │ │ ├── MovieFragmentRandomAccessBoxTest.kt │ │ │ │ │ ├── MovieHeaderBoxTest.kt │ │ │ │ │ ├── OpusSampleEntryTest.kt │ │ │ │ │ ├── SampleSizeBoxTest.kt │ │ │ │ │ ├── SampleToChunkBoxTest.kt │ │ │ │ │ ├── SoundMediaHeaderBoxTest.kt │ │ │ │ │ ├── SyncSampleBoxTest.kt │ │ │ │ │ ├── TimeToSampleBoxTest.kt │ │ │ │ │ ├── TrackFragmentBaseMediaDecodeTimeBoxTest.kt │ │ │ │ │ ├── TrackFragmentHeaderBoxTest.kt │ │ │ │ │ ├── TrackFragmentRandomAccessBoxTest.kt │ │ │ │ │ ├── TrackHeaderBoxTest.kt │ │ │ │ │ ├── TrackRunBoxTest.kt │ │ │ │ │ └── VideoMediaHeaderBoxTest.kt │ │ │ └── ts │ │ │ │ ├── TSResourcesUtils.kt │ │ │ │ ├── TsMuxerTest.kt │ │ │ │ ├── descriptors │ │ │ │ └── AdaptationFieldTest.kt │ │ │ │ ├── packets │ │ │ │ ├── PesTest.kt │ │ │ │ └── TransportStreamTest.kt │ │ │ │ ├── tables │ │ │ │ ├── PatTest.kt │ │ │ │ ├── PesHeaderTest.kt │ │ │ │ ├── PmtTest.kt │ │ │ │ ├── SdtTest.kt │ │ │ │ └── TableHeaderTest.kt │ │ │ │ └── utils │ │ │ │ ├── MockUtils.kt │ │ │ │ ├── Utils.kt │ │ │ │ └── av │ │ │ │ └── OpusControlHeaderTest.kt │ │ │ └── sinks │ │ │ ├── AbstractLocalSinkTest.kt │ │ │ ├── FileSinkTest.kt │ │ │ └── OutputStreamSinkFileTest.kt │ │ ├── sources │ │ └── AudioCaptureUnitTest.kt │ │ └── utils │ │ ├── ByteBufferPoolTest.kt │ │ ├── ChunkedFileOutputStreamTest.kt │ │ ├── DescriptorUtils.kt │ │ ├── FakeFrames.kt │ │ ├── FileUtils.kt │ │ ├── MockUtils.kt │ │ ├── ResourcesUtils.kt │ │ ├── StubBufferPool.kt │ │ ├── StubLogger.kt │ │ ├── StubRawFrameFactory.kt │ │ ├── Utils.kt │ │ ├── av │ │ ├── BitBufferTest.kt │ │ ├── audio │ │ │ ├── AudioSpecificConfigTest.kt │ │ │ ├── aac │ │ │ │ ├── ADTSTest.kt │ │ │ │ ├── AudioMuxElementTest.kt │ │ │ │ └── LATMFrameWriterTest.kt │ │ │ └── opus │ │ │ │ └── OpusCsdParserTest.kt │ │ ├── descriptors │ │ │ └── ESDescriptorTest.kt │ │ └── video │ │ │ ├── avc │ │ │ └── AVCDecoderConfigurationRecordTest.kt │ │ │ └── hevc │ │ │ └── HEVCDecoderConfigurationRecordTest.kt │ │ └── extensions │ │ ├── ByteBufferExtensionsKtTest.kt │ │ └── ListExtensionsKtTest.kt │ └── resources │ └── test-samples │ ├── audio │ ├── adts │ │ ├── adts-378bytes │ │ └── adts-516bytes │ └── latm │ │ ├── aac-he-44100Hz-mono │ │ ├── aac.latm │ │ ├── esds.raw │ │ └── frame.raw │ │ ├── aac-hev2-44100Hz-stereo │ │ ├── aac.latm │ │ ├── esds.raw │ │ └── frame.raw │ │ └── aac-lc-44100Hz-mono │ │ ├── aac.latm │ │ ├── audio-mux-element │ │ └── frame.raw │ ├── muxer │ ├── mp4 │ │ ├── Opus.box │ │ ├── avc1.box │ │ ├── avcC.box │ │ ├── btrt.box │ │ ├── dinf.box │ │ ├── dref.box │ │ ├── ftyp.box │ │ ├── hdlr.box │ │ ├── hvc1.box │ │ ├── hvcC.box │ │ ├── mfhd.box │ │ ├── mfra.box │ │ ├── mp4a.box │ │ ├── mvhd.box │ │ ├── smhd.box │ │ ├── stco.box │ │ ├── stsc.box │ │ ├── stss.box │ │ ├── stsz.box │ │ ├── stts.box │ │ ├── tfdt.box │ │ ├── tfhd.box │ │ ├── tfra.box │ │ ├── tkhd.box │ │ ├── trun.box │ │ └── vmhd.box │ └── ts │ │ ├── adaptation-field.ts │ │ ├── pat.ts │ │ ├── pes-audio1 │ │ ├── frame000.ts │ │ ├── frame001.ts │ │ ├── frame002.ts │ │ └── raw.aac │ │ ├── pes-audio2 │ │ ├── frame000.ts │ │ ├── frame001.ts │ │ └── raw.aac │ │ ├── pes-header.ts │ │ ├── pes-video1 │ │ ├── frame000.ts │ │ ├── frame001.ts │ │ ├── frame002.ts │ │ ├── frame003.ts │ │ ├── frame004.ts │ │ ├── frame005.ts │ │ ├── frame006.ts │ │ ├── frame007.ts │ │ ├── frame008.ts │ │ ├── frame009.ts │ │ ├── frame010.ts │ │ ├── frame011.ts │ │ ├── frame012.ts │ │ ├── frame013.ts │ │ ├── frame014.ts │ │ ├── frame015.ts │ │ ├── frame016.ts │ │ ├── frame017.ts │ │ ├── frame018.ts │ │ ├── frame019.ts │ │ ├── frame020.ts │ │ ├── frame021.ts │ │ ├── frame022.ts │ │ ├── frame023.ts │ │ ├── frame024.ts │ │ ├── frame025.ts │ │ ├── frame026.ts │ │ ├── frame027.ts │ │ ├── frame028.ts │ │ ├── frame029.ts │ │ ├── frame030.ts │ │ ├── frame031.ts │ │ ├── frame032.ts │ │ ├── frame033.ts │ │ ├── frame034.ts │ │ ├── frame035.ts │ │ ├── frame036.ts │ │ ├── frame037.ts │ │ ├── frame038.ts │ │ ├── frame039.ts │ │ ├── frame040.ts │ │ ├── frame041.ts │ │ ├── frame042.ts │ │ ├── frame043.ts │ │ ├── frame044.ts │ │ ├── frame045.ts │ │ ├── frame046.ts │ │ ├── frame047.ts │ │ ├── frame048.ts │ │ ├── frame049.ts │ │ ├── frame050.ts │ │ ├── frame051.ts │ │ ├── frame052.ts │ │ ├── frame053.ts │ │ ├── frame054.ts │ │ ├── frame055.ts │ │ ├── frame056.ts │ │ ├── frame057.ts │ │ ├── frame058.ts │ │ ├── frame059.ts │ │ ├── frame060.ts │ │ ├── frame061.ts │ │ ├── frame062.ts │ │ ├── frame063.ts │ │ ├── frame064.ts │ │ ├── frame065.ts │ │ ├── frame066.ts │ │ ├── frame067.ts │ │ ├── frame068.ts │ │ ├── frame069.ts │ │ ├── frame070.ts │ │ ├── frame071.ts │ │ ├── frame072.ts │ │ ├── frame073.ts │ │ ├── frame074.ts │ │ ├── frame075.ts │ │ ├── frame076.ts │ │ ├── frame077.ts │ │ ├── frame078.ts │ │ ├── frame079.ts │ │ ├── frame080.ts │ │ ├── frame081.ts │ │ ├── frame082.ts │ │ ├── frame083.ts │ │ ├── frame084.ts │ │ ├── frame085.ts │ │ ├── frame086.ts │ │ ├── frame087.ts │ │ ├── frame088.ts │ │ ├── frame089.ts │ │ ├── frame090.ts │ │ ├── frame091.ts │ │ ├── frame092.ts │ │ ├── frame093.ts │ │ ├── frame094.ts │ │ ├── frame095.ts │ │ ├── frame096.ts │ │ ├── frame097.ts │ │ ├── frame098.ts │ │ ├── frame099.ts │ │ ├── frame100.ts │ │ ├── frame101.ts │ │ ├── frame102.ts │ │ ├── frame103.ts │ │ ├── frame104.ts │ │ ├── frame105.ts │ │ ├── frame106.ts │ │ ├── frame107.ts │ │ ├── frame108.ts │ │ ├── frame109.ts │ │ ├── frame110.ts │ │ ├── frame111.ts │ │ ├── frame112.ts │ │ ├── frame113.ts │ │ ├── frame114.ts │ │ ├── frame115.ts │ │ ├── frame116.ts │ │ ├── frame117.ts │ │ ├── frame118.ts │ │ ├── frame119.ts │ │ ├── frame120.ts │ │ ├── frame121.ts │ │ ├── frame122.ts │ │ ├── frame123.ts │ │ ├── frame124.ts │ │ ├── frame125.ts │ │ ├── frame126.ts │ │ ├── frame127.ts │ │ ├── frame128.ts │ │ ├── frame129.ts │ │ ├── frame130.ts │ │ ├── frame131.ts │ │ ├── frame132.ts │ │ ├── frame133.ts │ │ ├── frame134.ts │ │ ├── frame135.ts │ │ ├── frame136.ts │ │ ├── frame137.ts │ │ ├── frame138.ts │ │ ├── frame139.ts │ │ ├── frame140.ts │ │ ├── frame141.ts │ │ ├── frame142.ts │ │ ├── frame143.ts │ │ ├── frame144.ts │ │ ├── frame145.ts │ │ ├── frame146.ts │ │ ├── frame147.ts │ │ ├── frame148.ts │ │ ├── frame149.ts │ │ ├── frame150.ts │ │ ├── frame151.ts │ │ ├── frame152.ts │ │ ├── frame153.ts │ │ ├── frame154.ts │ │ ├── frame155.ts │ │ ├── frame156.ts │ │ ├── frame157.ts │ │ ├── frame158.ts │ │ ├── frame159.ts │ │ ├── frame160.ts │ │ ├── frame161.ts │ │ ├── frame162.ts │ │ ├── frame163.ts │ │ ├── frame164.ts │ │ ├── frame165.ts │ │ ├── frame166.ts │ │ ├── frame167.ts │ │ ├── frame168.ts │ │ ├── frame169.ts │ │ ├── frame170.ts │ │ ├── frame171.ts │ │ ├── frame172.ts │ │ ├── frame173.ts │ │ ├── frame174.ts │ │ ├── frame175.ts │ │ ├── frame176.ts │ │ ├── frame177.ts │ │ └── raw │ │ ├── pmt.ts │ │ ├── sdt.ts │ │ └── table-header.ts │ └── utils │ └── av │ ├── audio │ └── opus │ │ └── opus.csd │ ├── descriptors │ └── es.descriptor │ └── video │ ├── AVCDecoderConfigurationRecord │ └── HEVCDecoderConfigurationRecord ├── demos ├── camera │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── io │ │ │ └── github │ │ │ └── thibaultbee │ │ │ └── streampack │ │ │ └── app │ │ │ ├── ApplicationConstants.kt │ │ │ ├── data │ │ │ ├── rotation │ │ │ │ └── RotationRepository.kt │ │ │ └── storage │ │ │ │ ├── DataStoreRepository.kt │ │ │ │ └── PreferencesDataStoreAdapter.kt │ │ │ ├── models │ │ │ ├── Endpoint.kt │ │ │ ├── EndpointType.kt │ │ │ └── FileExtension.kt │ │ │ ├── ui │ │ │ ├── BindingAdapters.kt │ │ │ ├── main │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── PreviewFragment.kt │ │ │ │ ├── PreviewViewModel.kt │ │ │ │ ├── PreviewViewModelFactory.kt │ │ │ │ └── usecases │ │ │ │ │ └── BuildStreamerUseCase.kt │ │ │ └── settings │ │ │ │ ├── SettingsActivity.kt │ │ │ │ └── SettingsFragment.kt │ │ │ └── utils │ │ │ ├── DialogUtils.kt │ │ │ ├── Extensions.kt │ │ │ ├── ObservableViewModel.kt │ │ │ ├── PermissionManager.kt │ │ │ ├── ProfileLevelDisplay.kt │ │ │ └── StreamerInfoFactory.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_baseline_cameraswitch_24.xml │ │ ├── ic_baseline_center_focus_strong_24.xml │ │ ├── ic_baseline_exposure_24.xml │ │ ├── ic_baseline_flash_on_24.xml │ │ ├── ic_baseline_mic_24.xml │ │ ├── ic_baseline_mic_off_24.xml │ │ ├── ic_baseline_more_vert_24.xml │ │ ├── ic_baseline_wb_auto_24.xml │ │ ├── ic_baseline_zoom_in_24.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_switch_camera_24px.xml │ │ ├── ic_toggle_mic_button.xml │ │ └── img_test.png │ │ ├── layout │ │ ├── main_activity.xml │ │ ├── main_fragment.xml │ │ └── settings_activity.xml │ │ ├── menu │ │ └── actions.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values │ │ ├── array.xml │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── root_preferences.xml └── screenrecorder │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── io │ │ └── github │ │ └── thibaultbee │ │ └── streampack │ │ └── screenrecorder │ │ ├── Configuration.kt │ │ ├── MainActivity.kt │ │ ├── models │ │ ├── Actions.kt │ │ ├── Endpoint.kt │ │ └── EndpointType.kt │ │ ├── services │ │ └── DemoScreenRecorderService.kt │ │ └── settings │ │ ├── SettingsActivity.kt │ │ └── SettingsFragment.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── ic_baseline_more_vert_24.xml │ ├── ic_baseline_notifications_24.xml │ ├── ic_baseline_stop_24.xml │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_main.xml │ └── activity_settings.xml │ ├── menu │ └── actions.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values │ ├── array.xml │ ├── colors.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ └── root_preferences.xml ├── docs ├── AdvancedStreamer.md ├── LiveAndRecordSimultaneously.md └── Streamers.md ├── extensions ├── README.md ├── rtmp │ ├── build.gradle.kts │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── io │ │ │ └── github │ │ │ └── thibaultbee │ │ │ └── streampack │ │ │ ├── core │ │ │ └── streamers │ │ │ │ └── single │ │ │ │ └── RtmpSingleStreamerTest.kt │ │ │ └── ext │ │ │ └── rtmp │ │ │ └── data │ │ │ └── RtmpMediaDescriptorTest.kt │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── io │ │ └── github │ │ └── thibaultbee │ │ └── streampack │ │ └── ext │ │ └── rtmp │ │ ├── data │ │ └── mediadescriptor │ │ │ └── RtmpMediaDescriptor.kt │ │ └── internal │ │ └── endpoints │ │ └── composites │ │ ├── RtmpEndpointFactory.kt │ │ └── sinks │ │ └── RtmpSink.kt └── srt │ ├── build.gradle.kts │ └── src │ ├── androidTest │ └── java │ │ └── io │ │ └── github │ │ └── thibaultbee │ │ └── streampack │ │ ├── core │ │ └── streamers │ │ │ └── single │ │ │ └── SrtSingleStreamerTest.kt │ │ └── ext │ │ └── srt │ │ └── data │ │ └── SrtMediaDescriptorTest.kt │ └── main │ ├── AndroidManifest.xml │ └── java │ └── io │ └── github │ └── thibaultbee │ └── streampack │ └── ext │ └── srt │ ├── data │ └── mediadescriptor │ │ └── SrtMediaDescriptor.kt │ ├── internal │ └── endpoints │ │ └── composites │ │ ├── SrtEndpointFactory.kt │ │ └── sinks │ │ └── SrtSink.kt │ └── regulator │ ├── DefaultSrtBitrateRegulator.kt │ ├── SrtBitrateRegulator.kt │ └── controllers │ └── DefaultSrtBitrateRegulatorController.kt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── services ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── io │ │ └── github │ │ └── thibaultbee │ │ └── streampack │ │ └── services │ │ ├── DefaultScreenRecorderService.kt │ │ └── utils │ │ └── NotificationUtils.kt │ └── res │ └── values │ └── attrs.xml ├── settings.gradle.kts ├── settings.libs.gradle.kts └── ui ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java └── io │ └── github │ └── thibaultbee │ └── streampack │ └── ui │ └── views │ ├── AutoFitSurfaceView.kt │ ├── PreviewView.kt │ ├── StreamerExtensions.kt │ ├── VideoSourceExtensions.kt │ └── ViewExtensions.kt └── res └── values └── attrs.xml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: ThibaultBee -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "gradle" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Gradle 2 | 3 | name: Build 4 | 5 | on: [push] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions/setup-java@v4 13 | with: 14 | java-version: 17 15 | distribution: 'adopt' 16 | - name: Grant execute permission for gradlew 17 | run: chmod +x gradlew 18 | - name: Assemble 19 | run: ./gradlew assemble 20 | - name: Upload APKs 21 | uses: actions/upload-artifact@v4 22 | with: 23 | name: apks 24 | path: | 25 | demos/**/build/outputs/apk/debug/*.apk 26 | 27 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Gradle 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle 3 | 4 | name: Updates API guide 5 | 6 | on: 7 | release: 8 | types: [ published ] 9 | 10 | jobs: 11 | update-doc: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: actions/setup-java@v4 16 | with: 17 | java-version: 17 18 | distribution: 'adopt' 19 | - name: Grant execute permission for gradlew 20 | run: chmod +x gradlew 21 | - name: Generate API documentation 22 | run: ./gradlew dokkaHtmlMultiModule 23 | - name: Deploy API documentation to Github Pages 24 | uses: JamesIves/github-pages-deploy-action@v4 25 | with: 26 | github_token: ${{ secrets.GITHUB_TOKEN }} 27 | branch: gh-pages 28 | folder: build/dokka/htmlMultiModule 29 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Publish package to Maven Central 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | jobs: 8 | publish: 9 | runs-on: ubuntu-latest 10 | permissions: 11 | contents: read 12 | packages: write 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: Set up JDK 16 | uses: actions/setup-java@v4 17 | with: 18 | java-version: '17' 19 | distribution: 'adopt' 20 | - name: Setup git config (for patch command) 21 | run: | 22 | git config --global user.name "GitHub Actions Bot" 23 | git config --global user.email "<>" 24 | - name: Grant execute permission for gradlew 25 | run: chmod +x gradlew 26 | - name: Publish package 27 | run: ./gradlew publish 28 | env: 29 | CENTRALPORTALTOKEN: ${{ secrets.CENTRALPORTALTOKEN }} 30 | GPG_KEY: ${{ secrets.GPG_KEY }} 31 | GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} 32 | GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }} -------------------------------------------------------------------------------- /.github/workflows/snapshot.yml: -------------------------------------------------------------------------------- 1 | name: Publish a snapshot package to Maven Central 2 | 3 | on: workflow_dispatch 4 | 5 | jobs: 6 | publish: 7 | runs-on: ubuntu-latest 8 | permissions: 9 | contents: read 10 | packages: write 11 | steps: 12 | - uses: actions/checkout@v4 13 | - name: Set up JDK 14 | uses: actions/setup-java@v4 15 | with: 16 | java-version: '17' 17 | distribution: 'adopt' 18 | - name: Setup git config (for patch command) 19 | run: | 20 | git config --global user.name "GitHub Actions Bot" 21 | git config --global user.email "<>" 22 | - name: Grant execute permission for gradlew 23 | run: chmod +x gradlew 24 | - name: Publish package 25 | run: ./gradlew publish 26 | env: 27 | MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} 28 | MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }} 29 | GPG_KEY: ${{ secrets.GPG_KEY }} 30 | GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }} 31 | GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | .DS_Store 6 | build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | .kotlin 11 | -------------------------------------------------------------------------------- /buildSrc/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.gradle.kotlin.dsl.`kotlin-dsl` 2 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 3 | 4 | plugins { 5 | `kotlin-dsl` 6 | } 7 | 8 | repositories { 9 | mavenCentral() 10 | google() 11 | gradlePluginPortal() 12 | } 13 | 14 | tasks.withType { 15 | kotlinOptions { 16 | jvmTarget = "17" 17 | } 18 | } 19 | 20 | java { 21 | sourceCompatibility = JavaVersion.VERSION_11 22 | targetCompatibility = JavaVersion.VERSION_11 23 | } 24 | 25 | dependencies { 26 | implementation(gradleApi()) 27 | implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) 28 | implementation(libs.android.gradle) 29 | } -------------------------------------------------------------------------------- /buildSrc/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | versionCatalogs { 3 | create("libs") { 4 | from(files("../gradle/libs.versions.toml")) 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/utils/ProjectExtensions.kt: -------------------------------------------------------------------------------- 1 | import org.gradle.api.Project 2 | 3 | val Project.isRelease: Boolean 4 | get() = version.toString().endsWith("-SNAPSHOT").not() 5 | 6 | val Project.isAndroid: Boolean 7 | get() = project.hasProperty("android") -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/utils/Property.kt: -------------------------------------------------------------------------------- 1 | enum class Property(val key: String) { 2 | CentralPortalToken("CENTRALPORTALTOKEN"), 3 | GpgKey("GPG_KEY"), 4 | GpgKeyId("GPG_KEY_ID"), 5 | GpgPassword("GPG_PASSWORD"); 6 | 7 | companion object { 8 | fun get(property: Property): String? = 9 | System.getProperty(property.key) ?: System.getenv(property.key) 10 | } 11 | } -------------------------------------------------------------------------------- /core/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /core/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /core/src/androidTest/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/src/androidTest/java/io/github/thibaultbee/streampack/core/elements/endpoints/MediaMuxerEndpointTest.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints 2 | 3 | import android.content.Context 4 | import android.net.Uri 5 | import androidx.test.platform.app.InstrumentationRegistry 6 | import io.github.thibaultbee.streampack.core.configuration.mediadescriptor.UriMediaDescriptor 7 | import kotlinx.coroutines.test.runTest 8 | import org.junit.Test 9 | 10 | class MediaMuxerEndpointTest { 11 | private val context: Context = InstrumentationRegistry.getInstrumentation().context 12 | private val mediaMuxerEndpoint = MediaMuxerEndpoint(context) 13 | 14 | @Test 15 | fun releaseMustNotThrow() { 16 | mediaMuxerEndpoint.release() 17 | } 18 | 19 | @Test 20 | fun closeMustNotThrow() = runTest { 21 | mediaMuxerEndpoint.close() 22 | } 23 | 24 | @Test 25 | fun openNotAFileTest() = runTest { 26 | try { 27 | mediaMuxerEndpoint.open(UriMediaDescriptor(Uri.parse("aaa://a/b/c/d"))) 28 | } catch (_: Throwable) { 29 | } 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /core/src/androidTest/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/sinks/SinkStateTest.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.sinks 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import kotlinx.coroutines.test.runTest 5 | import org.junit.Test 6 | import org.junit.runner.RunWith 7 | import org.junit.runners.Parameterized 8 | 9 | /** 10 | * Test class for [ISink] state. 11 | */ 12 | @RunWith(Parameterized::class) 13 | class SinkStateTest(private val endpoint: ISinkInternal) { 14 | @Test 15 | fun closeTest() = runTest { 16 | endpoint.close() 17 | } 18 | 19 | companion object { 20 | @JvmStatic 21 | @Parameterized.Parameters( 22 | name = "Sink: {0}" 23 | ) 24 | fun getMediaDescriptor(): Iterable { 25 | val context = InstrumentationRegistry.getInstrumentation().context 26 | 27 | return arrayListOf( 28 | FileSink(), 29 | ContentSink(context), 30 | ChunkedFileOutputStreamSink(1000), 31 | FakeSink() 32 | ) 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /core/src/androidTest/java/io/github/thibaultbee/streampack/core/utils/FileUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.utils 17 | 18 | import androidx.test.platform.app.InstrumentationRegistry 19 | import java.io.File 20 | 21 | object FileUtils { 22 | fun createCacheFile(name: String): File { 23 | return File(InstrumentationRegistry.getInstrumentation().context.cacheDir, name) 24 | } 25 | } -------------------------------------------------------------------------------- /core/src/androidTest/java/io/github/thibaultbee/streampack/core/utils/SurfaceUtils.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.utils 2 | 3 | import android.graphics.SurfaceTexture 4 | import android.util.Size 5 | import android.view.Surface 6 | 7 | object SurfaceUtils { 8 | fun createSurface(resolution: Size): Surface { 9 | val surfaceTexture = SurfaceTexture(0) 10 | surfaceTexture.setDefaultBufferSize(resolution.width, resolution.height) 11 | return Surface(surfaceTexture) 12 | } 13 | } -------------------------------------------------------------------------------- /core/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/configuration/BitrateRegulatorConfig.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.configuration 17 | 18 | import android.util.Range 19 | 20 | /** 21 | * Bitrate regulator configuration. Use it to control bitrate 22 | */ 23 | data class BitrateRegulatorConfig( 24 | /** 25 | * Video encoder bitrate ranges in bits/s. 26 | */ 27 | val videoBitrateRange: Range = Range(500000, 10000000), 28 | /** 29 | * Audio encoder bitrate ranges in bits/s. 30 | */ 31 | val audioBitrateRange: Range = Range(128000, 128000) 32 | ) 33 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/configuration/mediadescriptor/CustomDataUtils.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.configuration.mediadescriptor 2 | 3 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.data.TSServiceInfo 4 | 5 | /** 6 | * Creates a default [TSServiceInfo]. 7 | */ 8 | fun createDefaultTsServiceInfo() = TSServiceInfo( 9 | TSServiceInfo.ServiceType.DIGITAL_TV, 10 | 0x4698, 11 | "Stream", 12 | "StreamPack" 13 | ) -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/ICompositeEndpointInternal.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites 2 | 3 | import io.github.thibaultbee.streampack.core.elements.endpoints.IEndpoint 4 | import io.github.thibaultbee.streampack.core.elements.endpoints.IEndpointInternal 5 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.IMuxer 6 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.sinks.ISink 7 | 8 | interface ICompositeEndpointInternal : IEndpointInternal, ICompositeEndpoint 9 | 10 | interface ICompositeEndpoint : IEndpoint { 11 | val muxer: IMuxer 12 | val sink: ISink 13 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/flv/amf/primitives/AmfInt16.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.primitives 17 | 18 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.AmfParameter 19 | import java.nio.ByteBuffer 20 | 21 | class AmfInt16(private val s: Short): AmfParameter() { 22 | constructor(i: Int): this(i.toShort()) 23 | 24 | override val size: Int 25 | get() = 2 26 | 27 | override fun encode(buffer: ByteBuffer) { 28 | buffer.putShort(s) 29 | } 30 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/flv/amf/primitives/AmfInt32.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.primitives 17 | 18 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.AmfParameter 19 | import java.nio.ByteBuffer 20 | 21 | class AmfInt32(private val i: Int): AmfParameter() { 22 | override val size: Int 23 | get() = 4 24 | 25 | override fun encode(buffer: ByteBuffer) { 26 | buffer.putInt(i) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/AVCConfigurationBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import io.github.thibaultbee.streampack.core.elements.utils.av.video.avc.AVCDecoderConfigurationRecord 19 | import java.nio.ByteBuffer 20 | 21 | class AVCConfigurationBox(private val config: AVCDecoderConfigurationRecord) : Box("avcC") { 22 | override val size: Int = super.size + config.size 23 | 24 | override fun write(output: ByteBuffer) { 25 | super.write(output) 26 | config.write(output) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/CleanApertureBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class CleanApertureBox : Box("clap") { 21 | override val size: Int = super.size 22 | 23 | override fun write(output: ByteBuffer) { 24 | super.write(output) 25 | throw NotImplementedError("CleanApertureBox is not implemented yet") 26 | } 27 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/DataInformationBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class DataInformationBox(private val dref: DataReferenceBox) : Box("dinf") { 21 | override val size: Int = super.size + dref.size 22 | 23 | override fun write(output: ByteBuffer) { 24 | super.write(output) 25 | dref.write(output) 26 | } 27 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/ESDSBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import io.github.thibaultbee.streampack.core.elements.utils.av.descriptors.ESDescriptor 19 | import java.nio.ByteBuffer 20 | 21 | class ESDSBox(private val esDescriptor: ESDescriptor) : FullBox("esds", 0, 0) { 22 | override val size: Int = super.size + esDescriptor.size 23 | 24 | override fun write(output: ByteBuffer) { 25 | super.write(output) 26 | esDescriptor.write(output) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/HEVCConfigurationBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import io.github.thibaultbee.streampack.core.elements.utils.av.video.hevc.HEVCDecoderConfigurationRecord 19 | import java.nio.ByteBuffer 20 | 21 | class HEVCConfigurationBox(private val config: HEVCDecoderConfigurationRecord) : Box("hvcC") { 22 | override val size: Int = super.size + config.size 23 | 24 | override fun write(output: ByteBuffer) { 25 | super.write(output) 26 | config.write(output) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/MediaDataBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class MediaDataBox(dataSize: Int) : Box("mdat") { 21 | override val size: Int = super.size + dataSize 22 | 23 | fun writeHeader(): ByteBuffer { 24 | val buffer = ByteBuffer.allocateDirect(super.size) 25 | write(buffer) 26 | buffer.rewind() 27 | return buffer 28 | } 29 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/MovieExtendsBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class MovieExtendsBox( 21 | private val trex: List, 22 | ) : Box("mvex") { 23 | override val size: Int = super.size + trex.sumOf { it.size } 24 | 25 | override fun write(output: ByteBuffer) { 26 | super.write(output) 27 | trex.forEach { it.write(output) } 28 | } 29 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/MovieFragmentHeaderBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class MovieFragmentHeaderBox(private val sequenceNumber: Int) : FullBox("mfhd", 0, 0) { 21 | override val size: Int = super.size + 4 22 | 23 | override fun write(output: ByteBuffer) { 24 | super.write(output) 25 | output.putInt(sequenceNumber) 26 | } 27 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/MovieFragmentRandomAccessOffsetBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class MovieFragmentRandomAccessOffsetBox(private val mfraSize: Int, version: Byte = 0) : 21 | FullBox("mfro", version, 0) { 22 | override val size: Int = super.size + 4 23 | 24 | override fun write(output: ByteBuffer) { 25 | super.write(output) 26 | output.putInt(mfraSize) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/NullMediaHeaderBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | class NullMediaHeaderBox : FullBox("nmhd", 0, 0) -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/PixelAspectRatioBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class PixelAspectRatioBox(private val hSpacing: Int, private val vSpacing: Int) : Box("pasp") { 21 | override val size: Int = super.size + 8 22 | 23 | override fun write(output: ByteBuffer) { 24 | super.write(output) 25 | output.putInt(hSpacing) 26 | output.putInt(vSpacing) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/SyncSampleBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class SyncSampleBox(private val sampleNumber: List) : FullBox("stss", 0, 0) { 21 | override val size: Int = super.size + 4 + 4 * sampleNumber.size 22 | 23 | override fun write(output: ByteBuffer) { 24 | super.write(output) 25 | output.putInt(sampleNumber.size) 26 | sampleNumber.forEach { output.putInt(it) } 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/boxes/TrackBox.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.boxes 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class TrackBox(val tkhd: TrackHeaderBox, val mdia: MediaBox) : Box("trak") { 21 | override val size: Int = super.size + tkhd.size + mdia.size 22 | 23 | override fun write(output: ByteBuffer) { 24 | super.write(output) 25 | tkhd.write(output) 26 | mdia.write(output) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/models/SegmenterFactory.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.models 2 | 3 | abstract class MP4SegmenterFactory { 4 | abstract fun build(hasAudio: Boolean, hasVideo: Boolean): MP4Segmenter 5 | } 6 | 7 | class DefaultMP4SegmenterFactory : MP4SegmenterFactory() { 8 | override fun build(hasAudio: Boolean, hasVideo: Boolean): MP4Segmenter { 9 | return DefaultMP4Segmenter(hasAudio, hasVideo) 10 | } 11 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/mp4/utils/TimeUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.mp4.utils 17 | 18 | import java.util.* 19 | import java.util.concurrent.TimeUnit 20 | 21 | object TimeUtils { 22 | val isomTimeBaseMs: Long = Calendar.getInstance(TimeZone.getTimeZone("GMT")).run { 23 | set(1904, 0, 1, 0, 0, 0) 24 | set(Calendar.MILLISECOND, 0) 25 | timeInMillis 26 | } 27 | 28 | val utcNowIsom: Long 29 | get() = TimeUnit.MILLISECONDS.toSeconds(Date().time - isomTimeBaseMs) 30 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/README.md: -------------------------------------------------------------------------------- 1 | # MPEG transport stream mux 2 | 3 | MPEG-TS muxer is a minimalist MPEG-TS muxer. 4 | It manages packets encapsulation and section tables (PAT, PMT, SDT). 5 | 6 | It supports the following operations: 7 | * Add/remove streams 8 | * Add/remove services 9 | * Encode of AAC and H264 frames 10 | 11 | ## Quick start 12 | 13 | 1/ Instantiates a `TSMuxer()`: 14 | 15 | ``` 16 | val muxer = TSMuxer(listener = object : IMuxerListerner { 17 | override fun onOutputFrame(packet: Packet) 18 | // Use packet 19 | } 20 | }) 21 | ``` 22 | 23 | 2/ Registers on or multiple services and streams: 24 | 25 | ``` 26 | val streamPid = muxer.addStreams(serviceInfo, listOf(audioConfig))[audioConfig] 27 | ``` 28 | 29 | 2/ Encodes frames with `encode`: 30 | 31 | ``` 32 | muxer.encode(frame, streamPid) 33 | ``` 34 | 35 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/data/ITSElement.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.data 17 | 18 | import java.nio.ByteBuffer 19 | 20 | interface ITSElement { 21 | val size: Int 22 | val bitSize: Int 23 | 24 | fun toByteBuffer(): ByteBuffer 25 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/data/Service.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.data 17 | 18 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.packets.Pmt 19 | 20 | class Service( 21 | val info: TSServiceInfo, 22 | var pmt: Pmt? = null, 23 | var streams: MutableList = mutableListOf(), 24 | var pcrPid: Short? = null 25 | ) -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/utils/MuxerConst.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.utils 17 | 18 | import io.github.thibaultbee.streampack.core.elements.data.Packet 19 | 20 | object MuxerConst { 21 | const val PAT_PACKET_PERIOD = 40 22 | const val SDT_PACKET_PERIOD = 200 23 | 24 | /** 25 | * Number of MPEG-TS packet stream in output [Packet] returns by [IMuxerListener.onOutputFrame] 26 | */ 27 | const val MAX_OUTPUT_PACKET_NUMBER = 7 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/utils/TSConst.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.utils 17 | 18 | object TSConst { 19 | const val SYSTEM_CLOCK_FREQ = 27000000 20 | const val BASE_PID = 0x00020.toShort() 21 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/utils/TSOutputCallback.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.utils 17 | 18 | import io.github.thibaultbee.streampack.core.elements.data.SrtPacket 19 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.IMuxerInternal 20 | 21 | open class TSOutputCallback(var listener: IMuxerInternal.IMuxerListener? = null) { 22 | protected fun writePacket(packet: SrtPacket) { 23 | packet.buffer.rewind() 24 | listener?.onOutputFrame(packet) 25 | } 26 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/sinks/ClosedException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.sinks 17 | 18 | /** 19 | * Class that encapsulates closed errors 20 | */ 21 | class ClosedException(cause: Throwable) : Exception(cause) { 22 | /** 23 | * @param message the error message 24 | * @param cause the error cause 25 | */ 26 | constructor(message: String, cause: Throwable) : this(Exception(message, cause)) 27 | 28 | /** 29 | * @param message the error message 30 | */ 31 | constructor(message: String) : this(Exception(message)) 32 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/sinks/SinkConfiguration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.sinks 17 | 18 | import io.github.thibaultbee.streampack.core.elements.encoders.CodecConfig 19 | 20 | /** 21 | * Internal class to configure [ISinkInternal]. 22 | */ 23 | data class SinkConfiguration(val streamConfigs: List) -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/processing/IFrameProcessor.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2025 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.processing 17 | 18 | import io.github.thibaultbee.streampack.core.elements.data.Frame 19 | import io.github.thibaultbee.streampack.core.elements.data.RawFrame 20 | 21 | /** 22 | * Interface to process a frame. 23 | * 24 | * @param T type of frame to process (probably [RawFrame] or [Frame]) 25 | */ 26 | interface IFrameProcessor { 27 | fun processFrame(frame: T): T 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/processing/audio/IAudioFrameProcessor.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2025 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.processing.audio 17 | 18 | /** 19 | * Public interface for audio frame processor. 20 | */ 21 | interface IAudioFrameProcessor { 22 | /** 23 | * Mute audio. 24 | */ 25 | var isMuted: Boolean 26 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/processing/video/utils/extensions/IntExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.processing.video.utils.extensions 17 | 18 | val Int.is90or270: Boolean 19 | get() { 20 | if (this == 90 || this == 270) { 21 | return true 22 | } 23 | if (this == 0 || this == 180) { 24 | return false 25 | } 26 | throw IllegalArgumentException("Invalid rotation degrees: $this") 27 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/processing/video/utils/extensions/RectFExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.processing.video.utils.extensions 2 | 3 | import android.graphics.Matrix 4 | import android.graphics.RectF 5 | import io.github.thibaultbee.streampack.core.elements.processing.video.utils.TransformUtils.NORMALIZED_RECT 6 | 7 | /** 8 | * Gets the transform from a normalized space (-1, -1) - (1, 1) to the given rect. 9 | */ 10 | val RectF.normalized: Matrix 11 | get() { 12 | val normalizedToBuffer = Matrix() 13 | normalizedToBuffer.setRectToRect(NORMALIZED_RECT, this, Matrix.ScaleToFit.FILL) 14 | return normalizedToBuffer 15 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/processing/video/utils/extensions/SizeExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.processing.video.utils.extensions 2 | 3 | import android.graphics.RectF 4 | import android.util.Size 5 | 6 | /** 7 | * Transforms size to a [RectF] with zero left and top. 8 | */ 9 | fun Size.toRectF(): RectF { 10 | return toRectF(0, 0) 11 | } 12 | 13 | /** 14 | * Transforms a size to a [RectF] with given left and top. 15 | */ 16 | fun Size.toRectF(left: Int, top: Int): RectF { 17 | return RectF( 18 | left.toFloat(), 19 | top.toFloat(), 20 | (left + width).toFloat(), 21 | (top + height).toFloat() 22 | ) 23 | } 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/sources/IMediaProjectionSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.sources 17 | 18 | import androidx.activity.result.ActivityResult 19 | 20 | /** 21 | * Interface to implement class that uses MediaProjection. 22 | * This interface is used to get the activity result from the activity. 23 | */ 24 | interface IMediaProjectionSource { 25 | /** 26 | * Set the activity result to get the media projection. 27 | */ 28 | var activityResult: ActivityResult? 29 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/sources/video/VideoSourceConfig.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.sources.video 2 | 3 | import android.util.Size 4 | import io.github.thibaultbee.streampack.core.elements.encoders.VideoCodecConfig.Companion.DEFAULT_FPS 5 | import io.github.thibaultbee.streampack.core.elements.encoders.VideoCodecConfig.Companion.DEFAULT_RESOLUTION 6 | import io.github.thibaultbee.streampack.core.elements.utils.av.video.DynamicRangeProfile 7 | 8 | data class VideoSourceConfig( 9 | /** 10 | * Video output resolution in pixel. 11 | */ 12 | val resolution: Size = DEFAULT_RESOLUTION, 13 | 14 | /** 15 | * Video framerate. 16 | */ 17 | val fps: Int = DEFAULT_FPS, 18 | 19 | /** 20 | * The dynamic range profile. 21 | * 22 | * **See Also:** [DynamicRangeProfiles](https://developer.android.com/reference/android/hardware/camera2/params/DynamicRangeProfiles) 23 | */ 24 | val dynamicRangeProfile: DynamicRangeProfile = DynamicRangeProfile.sdr 25 | ) { 26 | /** 27 | * The Android dynamic range profile. 28 | */ 29 | val dynamicRange = dynamicRangeProfile.dynamicRange 30 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/sources/video/bitmap/IBitmapSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2025 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.sources.video.bitmap 17 | 18 | import android.graphics.Bitmap 19 | import io.github.thibaultbee.streampack.core.elements.sources.video.IPreviewableSource 20 | 21 | interface IBitmapSource : IPreviewableSource { 22 | /** 23 | * Gets a bitmap to be displayed. 24 | */ 25 | val bitmap: Bitmap 26 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/sources/video/camera/CameraException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.sources.video.camera 17 | 18 | /** 19 | * Class that encapsulates camera errors 20 | * 21 | * @param message the error message 22 | */ 23 | class CameraException(message: String) : 24 | Exception(message) -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/sources/video/camera/controllers/CameraDeviceController.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.sources.video.camera.controllers 2 | 3 | import android.hardware.camera2.CameraDevice 4 | import android.os.Build 5 | import androidx.annotation.RequiresApi 6 | import java.io.Closeable 7 | 8 | /** 9 | * A data class that encapsulates a [CameraDevice] and implements [Closeable]. 10 | * 11 | * Avoid to call [CameraDevice.close] multiple times. 12 | */ 13 | data class CameraDeviceController(val camera: CameraDevice) : Closeable { 14 | private var isClosed: Boolean = false 15 | 16 | val id = camera.id 17 | 18 | var cameraAudioRestriction: Int 19 | @RequiresApi(Build.VERSION_CODES.R) 20 | get() = camera.cameraAudioRestriction 21 | @RequiresApi(Build.VERSION_CODES.R) 22 | set(value) { 23 | camera.cameraAudioRestriction = value 24 | } 25 | 26 | override fun close() { 27 | if (isClosed) { 28 | return 29 | } 30 | isClosed = true 31 | camera.close() 32 | } 33 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/Annotations.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils 2 | 3 | import android.media.AudioFormat 4 | import android.view.Surface 5 | import androidx.annotation.IntDef 6 | 7 | /** 8 | * Valid integer rotation values. 9 | */ 10 | @IntDef(Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, Surface.ROTATION_270) 11 | @Retention( 12 | AnnotationRetention.SOURCE 13 | ) 14 | annotation class RotationValue 15 | 16 | /** 17 | * Valid channel config 18 | */ 19 | @IntDef(AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO) 20 | @Retention( 21 | AnnotationRetention.SOURCE 22 | ) 23 | annotation class ChannelConfigValue 24 | 25 | /** 26 | * Valid channel config 27 | */ 28 | @IntDef( 29 | AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_FLOAT 30 | ) 31 | @Retention( 32 | AnnotationRetention.SOURCE 33 | ) 34 | annotation class ByteFormatValue 35 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/ListUtils.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils 2 | 3 | object ListUtils { 4 | private val alphabet: List = ('a'..'z') + ('A'..'Z') + ('0'..'9') 5 | 6 | fun generateRandomString(length: Int): String { 7 | return List(length) { alphabet.random() }.joinToString("") 8 | } 9 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/TimeUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils 17 | 18 | object TimeUtils { 19 | /** 20 | * Gets current time from a unique source. Uses it for timestamp. 21 | */ 22 | fun currentTime() = System.nanoTime() / 1000 // to µs 23 | 24 | /** 25 | * Number of time units in a second. 26 | */ 27 | const val TIME_SCALE = 1_000_000 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/WindowUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils 17 | 18 | import android.content.Context 19 | import androidx.window.layout.WindowMetricsCalculator 20 | 21 | object WindowUtils { 22 | fun getScreenRect(context: Context) = 23 | WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(context).bounds 24 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/FourCC.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils.av 2 | 3 | import android.media.MediaFormat 4 | import android.os.Build 5 | 6 | 7 | enum class FourCCs(val value: FourCC) { 8 | AV1( 9 | FourCC( 10 | 'a', 'v', '0', '1', if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { 11 | MediaFormat.MIMETYPE_VIDEO_AV1 12 | } else { 13 | null 14 | } 15 | ) 16 | ), 17 | VP9(FourCC('v', 'p', '0', '9', MediaFormat.MIMETYPE_VIDEO_VP9)), 18 | HEVC(FourCC('h', 'v', 'c', '1', MediaFormat.MIMETYPE_VIDEO_HEVC)); 19 | 20 | companion object { 21 | fun fromMimeType(mimeType: String) = 22 | entries.first { it.value.mimeType == mimeType } 23 | } 24 | } 25 | 26 | data class FourCC(val a: Char, val b: Char, val c: Char, val d: Char, val mimeType: String?) { 27 | val code: Int 28 | get() = (a.code shl 24) or (b.code shl 16) or (c.code shl 8) or d.code 29 | 30 | override fun toString(): String { 31 | return "$a$b$c$d" 32 | } 33 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/audio/aac/config/SpecificConfig.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.av.audio.aac.config 17 | 18 | import io.github.thibaultbee.streampack.core.elements.utils.av.buffer.BitBufferWriter 19 | 20 | abstract class SpecificConfig : BitBufferWriter() -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/descriptors/BaseDescriptor.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.av.descriptors 17 | 18 | import io.github.thibaultbee.streampack.core.elements.utils.av.buffer.ByteBufferWriter 19 | 20 | abstract class BaseDescriptor(private val tag: Tags, private val sizeOfInstance: Int) : 21 | ByteBufferWriter() { 22 | override val size = 2 + sizeOfInstance 23 | 24 | override fun write(output: java.nio.ByteBuffer) { 25 | output.put(tag.value) 26 | output.put(sizeOfInstance.toByte()) // TODO: deal with larger sizeOfInstance 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/descriptors/DecoderSpecificInfo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.av.descriptors 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class DecoderSpecificInfo( 21 | private val specificConfig: ByteBuffer, 22 | ) : BaseDescriptor(Tags.DecSpecificInfo, specificConfig.remaining()) { 23 | 24 | override fun write(output: ByteBuffer) { 25 | super.write(output) 26 | output.put(specificConfig) 27 | } 28 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/descriptors/SLConfigDescriptor.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.av.descriptors 17 | 18 | import java.nio.ByteBuffer 19 | 20 | class SLConfigDescriptor( 21 | private val predefined: Byte, 22 | ) : BaseDescriptor(Tags.SLConfigDescr, 1) { 23 | 24 | override fun write(output: ByteBuffer) { 25 | super.write(output) 26 | output.put(predefined) 27 | if (predefined == 0.toByte()) { 28 | throw NotImplementedError("SLConfigDescriptor with predefined == 0 is not implemented") 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/video/H26X.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.av.video 17 | 18 | enum class ChromaFormat(val value: Byte) { 19 | YUV400(0), 20 | YUV420(1), 21 | YUV422(2), 22 | YUV444(3); 23 | 24 | companion object { 25 | fun fromChromaIdc(chromaIdc: Byte) = 26 | entries.first { it.value == chromaIdc } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/video/vpx/ChromaSubsampling.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.av.video.vpx 17 | 18 | enum class ChromaSubsampling(val value: Byte) { 19 | YUV420_VERTICAL(0), 20 | YUV420_COLLOCATED_WITH_LUMA(1), 21 | YUV422(2), 22 | YUV444(3), 23 | YUV440(4); 24 | 25 | companion object { 26 | fun fromValue(value: Byte) = 27 | entries.first { it.value == value } 28 | } 29 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/av/video/vpx/Profile.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils.av.video.vpx 2 | 3 | import android.media.MediaCodecInfo 4 | 5 | enum class Profile(val value: Int) { 6 | PROFILE_0(0), 7 | PROFILE_1(1), 8 | PROFILE_2(2), 9 | PROFILE_3(3); 10 | 11 | companion object { 12 | fun fromValue(value: Int) = entries.first { it.value == value } 13 | 14 | fun fromMediaFormat(mediaCodecProfile: Int) = when (mediaCodecProfile) { 15 | MediaCodecInfo.CodecProfileLevel.VP9Profile0 -> PROFILE_0 16 | MediaCodecInfo.CodecProfileLevel.VP9Profile1 -> PROFILE_1 17 | MediaCodecInfo.CodecProfileLevel.VP9Profile2 -> PROFILE_2 18 | MediaCodecInfo.CodecProfileLevel.VP9Profile2HDR -> PROFILE_2 19 | MediaCodecInfo.CodecProfileLevel.VP9Profile2HDR10Plus -> PROFILE_2 20 | MediaCodecInfo.CodecProfileLevel.VP9Profile3 -> PROFILE_3 21 | MediaCodecInfo.CodecProfileLevel.VP9Profile3HDR -> PROFILE_3 22 | MediaCodecInfo.CodecProfileLevel.VP9Profile3HDR10Plus -> PROFILE_3 23 | else -> throw IllegalArgumentException("Unknown profile: $mediaCodecProfile") 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/extensions/AudioEffectExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.extensions 17 | 18 | import android.media.audiofx.AudioEffect 19 | import java.util.UUID 20 | 21 | val AudioEffect.type: UUID 22 | get() = descriptor.type -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/extensions/CancellableContinuationExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils.extensions 2 | 3 | import kotlinx.coroutines.CancellableContinuation 4 | import kotlin.coroutines.resume 5 | import kotlin.coroutines.resumeWithException 6 | 7 | 8 | internal fun CancellableContinuation.resumeIfActive(value: T) { 9 | if (isActive) { 10 | resume(value) 11 | } 12 | } 13 | 14 | internal fun CancellableContinuation.resumeWithExceptionIfActive(exception: Throwable) { 15 | if (isActive) { 16 | resumeWithException(exception) 17 | } 18 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/extensions/ListExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.extensions 17 | 18 | fun Iterable>.unzip(): List> { 19 | val expectedSize = this.first().size 20 | val result = MutableList(expectedSize) { mutableListOf() } 21 | this.forEach { list -> 22 | if (list.size != expectedSize) { 23 | throw IndexOutOfBoundsException("List size must be the same") 24 | } 25 | list.forEachIndexed { index, element -> 26 | result[index].add(element) 27 | } 28 | } 29 | return result 30 | } 31 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/extensions/RectExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2023 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.extensions 17 | 18 | import android.graphics.Rect 19 | import android.util.Size 20 | 21 | /** 22 | * Returns the [Size] of the [Rect]. 23 | */ 24 | val Rect.size: Size 25 | get() = Size(width(), height()) 26 | 27 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/extensions/StringExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils.extensions 17 | 18 | /** 19 | * Check if mime type is a video mime type. 20 | * 21 | * @return true if mime type is video, otherwise false 22 | */ 23 | internal val String.isVideo: Boolean 24 | get() = this.startsWith("video") 25 | 26 | /** 27 | * Check if mime type is an audio mime type. 28 | * 29 | * @return true if mime type is audio, otherwise false 30 | */ 31 | internal val String.isAudio: Boolean 32 | get() = this.startsWith("audio") 33 | -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/extensions/ThrowableExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils.extensions 2 | 3 | /** 4 | * Get root cause. This code is from guava Throwables API. 5 | */ 6 | val Throwable.rootCause: Throwable 7 | get() { 8 | // Keep a second pointer that slowly walks the causal chain. If the fast pointer ever catches 9 | // the slower pointer, then there's a loop. 10 | var throwable = this 11 | var slowPointer: Throwable? = throwable 12 | var advanceSlowPointer = false 13 | 14 | while (throwable.cause != null) { 15 | throwable = throwable.cause!! 16 | if (throwable === slowPointer) { 17 | throw IllegalArgumentException("Loop in causal chain detected.", throwable) 18 | } 19 | if (advanceSlowPointer) { 20 | slowPointer = slowPointer!!.cause 21 | } 22 | advanceSlowPointer = !advanceSlowPointer // only advance every other iteration 23 | } 24 | return throwable 25 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/pool/IFrameFactory.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils.pool 2 | 3 | import io.github.thibaultbee.streampack.core.elements.data.RawFrame 4 | 5 | interface IReadOnlyRawFrameFactory { 6 | /** 7 | * Creates a [RawFrame]. 8 | * 9 | * The returned frame must be released by calling [RawFrame.close] when it is not used anymore. 10 | * 11 | * @param bufferSize the buffer size 12 | * @param timestampInUs the frame timestamp in µs 13 | * @return a frame 14 | */ 15 | fun create(bufferSize: Int, timestampInUs: Long): RawFrame 16 | } 17 | 18 | /** 19 | * A pool of frames. 20 | */ 21 | interface IRawFrameFactory : IReadOnlyRawFrameFactory { 22 | /** 23 | * Clears the factory. 24 | */ 25 | fun clear() 26 | 27 | /** 28 | * Closes the factory. 29 | */ 30 | fun close() 31 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/logger/Logger.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.logger 2 | 3 | object Logger : ILogger { 4 | /** 5 | * The logger implementation. 6 | * Customize it by setting a new [ILogger] implementation. 7 | */ 8 | var logger: ILogger = StreamPackLogger() 9 | 10 | override fun e(tag: String, message: String, tr: Throwable?) { 11 | logger.e(tag, message, tr) 12 | } 13 | 14 | override fun w(tag: String, message: String, tr: Throwable?) { 15 | logger.w(tag, message, tr) 16 | } 17 | 18 | override fun i(tag: String, message: String, tr: Throwable?) { 19 | logger.i(tag, message, tr) 20 | } 21 | 22 | override fun v(tag: String, message: String, tr: Throwable?) { 23 | logger.v(tag, message, tr) 24 | } 25 | 26 | override fun d(tag: String, message: String, tr: Throwable?) { 27 | logger.d(tag, message, tr) 28 | } 29 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/streamers/utils/ScreenRecorder.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.streamers.utils 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.media.projection.MediaProjectionManager 6 | 7 | object ScreenRecorderUtils { 8 | /** 9 | * Creates a screen recorder intent. 10 | */ 11 | fun createScreenRecorderIntent(context: Context): Intent = 12 | (context.getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager).run { 13 | createScreenCaptureIntent() 14 | } 15 | } -------------------------------------------------------------------------------- /core/src/main/java/io/github/thibaultbee/streampack/core/utils/extensions/ThrowableExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.utils.extensions 17 | 18 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.sinks.ClosedException 19 | 20 | /** 21 | * Whether the [Throwable] is a [ClosedException] 22 | */ 23 | val Throwable.isClosedException: Boolean 24 | get() = this is ClosedException -------------------------------------------------------------------------------- /core/src/main/res/drawable/ic_baseline_linked_camera_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /core/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | StreamPack 4 | Waiting 5 | An error occurred 6 | Closed 7 | Open failed 8 | Live in progress… 9 | -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/flv/amf/containers/AmfEcmaArrayTest.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.containers 2 | 3 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.AmfType 4 | import io.github.thibaultbee.streampack.core.elements.utils.extensions.toByteArray 5 | import org.junit.Assert.assertArrayEquals 6 | import org.junit.Test 7 | 8 | class AmfEcmaArrayTest { 9 | @Test 10 | fun `encode array with int test`() { 11 | val i = 4 12 | val a = AmfEcmaArray() 13 | a.add(i) 14 | val buffer = a.encode() 15 | 16 | val expectedArray = byteArrayOf( 17 | AmfType.ECMA_ARRAY.value, 0, 0, 0, 1, // Array header 18 | 0, 0, 0, 4, // value 19 | 0, 0, AmfType.OBJECT_END.value // Array footer 20 | ) 21 | assertArrayEquals( 22 | expectedArray, 23 | buffer.toByteArray() 24 | ) 25 | } 26 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/flv/amf/primitives/AmfBooleanTest.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.primitives 2 | 3 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.AmfType 4 | import io.github.thibaultbee.streampack.core.elements.utils.extensions.toByteArray 5 | import org.junit.Assert.assertArrayEquals 6 | import org.junit.Test 7 | 8 | class AmfBooleanTest { 9 | @Test 10 | fun `encode boolean test`() { 11 | val b = true 12 | val amfBoolean = AmfBoolean(b) 13 | val buffer = amfBoolean.encode() 14 | 15 | val expectedArray = byteArrayOf( 16 | AmfType.BOOLEAN.value, if (b) { 17 | 1 18 | } else { 19 | 0 20 | } 21 | ) 22 | assertArrayEquals(expectedArray, buffer.toByteArray()) // Remove direct part 23 | } 24 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/flv/amf/primitives/AmfInt32Test.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.primitives 2 | 3 | import org.junit.Assert.* 4 | import org.junit.Test 5 | 6 | class AmfInt32Test { 7 | 8 | @Test 9 | fun `encode int test`() { 10 | val i = 4 11 | val amfInt32 = AmfInt32(i) 12 | val buffer = amfInt32.encode() 13 | 14 | assertEquals(i, buffer.getInt(0)) 15 | } 16 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/flv/amf/primitives/AmfStringTest.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.primitives 2 | 3 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.flv.amf.AmfType 4 | import io.github.thibaultbee.streampack.core.elements.utils.extensions.toByteArray 5 | import org.junit.Assert.assertArrayEquals 6 | import org.junit.Test 7 | 8 | class AmfStringTest { 9 | @Test 10 | fun `encode string test`() { 11 | val s = "stringToEncode" 12 | val amfString = AmfString(s) 13 | val buffer = amfString.encode() 14 | 15 | val expectedArray = 16 | byteArrayOf(AmfType.STRING.value, 0, s.length.toByte()) + s.toByteArray() 17 | assertArrayEquals( 18 | expectedArray, 19 | buffer.toByteArray() 20 | ) 21 | } 22 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/utils/Utils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.utils 17 | 18 | import io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.data.TSServiceInfo 19 | 20 | object Utils { 21 | fun createFakeServiceInfo() = TSServiceInfo( 22 | TSServiceInfo.ServiceType.DIGITAL_TV, 23 | 0x4698, 24 | "ServiceName", 25 | "ProviderName" 26 | ) 27 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/endpoints/composites/muxers/ts/utils/av/OpusControlHeaderTest.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.endpoints.composites.muxers.ts.utils.av 2 | 3 | import io.github.thibaultbee.streampack.core.elements.utils.extensions.toByteArray 4 | import org.junit.Assert.assertArrayEquals 5 | import org.junit.Test 6 | 7 | class OpusControlHeaderTest { 8 | @Test 9 | fun `test write`() { 10 | val opusControlHeader = OpusControlHeader(payloadSize = 515) 11 | val output = opusControlHeader.toByteBuffer() 12 | assertArrayEquals( 13 | byteArrayOf( 14 | 0x7F, 0xE0.toByte(), 0xFF.toByte(), 0xFF.toByte(), 0x5 15 | ), 16 | output.toByteArray() 17 | ) 18 | } 19 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/utils/FileUtils.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.core.elements.utils 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import java.io.File 5 | 6 | object FileUtils { 7 | fun createTestFile(suffix: String = ".tmp"): File { 8 | val tmpFile = File.createTempFile("test", suffix) 9 | tmpFile.deleteOnExit() 10 | return tmpFile 11 | } 12 | 13 | fun createCacheFile(name: String): File { 14 | return File(InstrumentationRegistry.getInstrumentation().context.cacheDir, name) 15 | } 16 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/utils/ResourcesUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2021 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils 17 | 18 | import java.nio.ByteBuffer 19 | 20 | object ResourcesUtils { 21 | fun readResources(filePath: String) = 22 | this.javaClass.classLoader!!.getResource(filePath)!!.readBytes() 23 | 24 | fun readByteBuffer(filePath: String): ByteBuffer = ByteBuffer.wrap(readResources(filePath)) 25 | } -------------------------------------------------------------------------------- /core/src/test/java/io/github/thibaultbee/streampack/core/elements/utils/StubBufferPool.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2025 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.core.elements.utils 17 | 18 | import io.github.thibaultbee.streampack.core.elements.utils.pool.IGetOnlyBufferPool 19 | import java.nio.ByteBuffer 20 | 21 | /** 22 | * Stub buffer pool for testing. 23 | * 24 | * It always returns a new allocated buffer. 25 | */ 26 | class StubBufferPool : IGetOnlyBufferPool { 27 | override fun get(capacity: Int): ByteBuffer { 28 | return ByteBuffer.allocate(capacity) 29 | } 30 | } -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/adts/adts-378bytes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/adts/adts-378bytes -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/adts/adts-516bytes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/adts/adts-516bytes -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-he-44100Hz-mono/aac.latm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-he-44100Hz-mono/aac.latm -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-he-44100Hz-mono/esds.raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-he-44100Hz-mono/esds.raw -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-he-44100Hz-mono/frame.raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-he-44100Hz-mono/frame.raw -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-hev2-44100Hz-stereo/aac.latm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-hev2-44100Hz-stereo/aac.latm -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-hev2-44100Hz-stereo/esds.raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-hev2-44100Hz-stereo/esds.raw -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-hev2-44100Hz-stereo/frame.raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-hev2-44100Hz-stereo/frame.raw -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-lc-44100Hz-mono/aac.latm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-lc-44100Hz-mono/aac.latm -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-lc-44100Hz-mono/audio-mux-element: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-lc-44100Hz-mono/audio-mux-element -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/audio/latm/aac-lc-44100Hz-mono/frame.raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/audio/latm/aac-lc-44100Hz-mono/frame.raw -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/Opus.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/Opus.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/avc1.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/avc1.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/avcC.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/avcC.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/btrt.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/btrt.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/dinf.box: -------------------------------------------------------------------------------- 1 | $dinfdref url  -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/dref.box: -------------------------------------------------------------------------------- 1 | dref url  -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/ftyp.box: -------------------------------------------------------------------------------- 1 | ftypisomisomiso2avc1mp41 -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/hdlr.box: -------------------------------------------------------------------------------- 1 | -hdlrvideVideoHandler -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/hvc1.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/hvc1.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/hvcC.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/hvcC.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/mfhd.box: -------------------------------------------------------------------------------- 1 | mfhd -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/mfra.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/mfra.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/mp4a.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/mp4a.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/mvhd.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/mvhd.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/smhd.box: -------------------------------------------------------------------------------- 1 | smhd -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/stco.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/stco.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/stsc.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/stsc.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/stss.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/stss.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/stsz.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/stsz.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/stts.box: -------------------------------------------------------------------------------- 1 | sttsF -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/tfdt.box: -------------------------------------------------------------------------------- 1 | tfdt< -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/tfhd.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/tfhd.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/tfra.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/tfra.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/tkhd.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/tkhd.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/trun.box: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/mp4/trun.box -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/mp4/vmhd.box: -------------------------------------------------------------------------------- 1 | vmhd -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/adaptation-field.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/adaptation-field.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pat.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pat.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio1/frame000.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio1/frame000.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio1/frame001.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio1/frame001.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio1/frame002.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio1/frame002.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio1/raw.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio1/raw.aac -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio2/frame000.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio2/frame000.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio2/frame001.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio2/frame001.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-audio2/raw.aac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-audio2/raw.aac -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-header.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-header.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame000.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame000.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame001.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame001.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame002.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame002.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame003.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame003.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame004.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame004.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame005.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame005.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame006.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame006.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame007.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame007.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame008.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame008.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame009.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame009.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame010.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame010.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame011.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame011.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame012.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame012.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame013.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame013.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame014.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame014.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame015.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame015.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame016.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame016.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame017.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame017.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame018.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame018.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame019.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame019.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame020.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame020.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame021.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame021.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame022.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame022.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame023.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame023.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame024.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame024.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame025.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame025.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame026.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame026.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame027.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame027.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame028.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame028.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame029.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame029.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame030.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame030.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame031.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame031.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame032.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame032.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame033.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame033.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame034.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame034.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame035.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame035.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame036.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame036.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame037.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame037.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame038.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame038.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame039.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame039.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame040.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame040.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame041.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame041.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame042.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame042.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame043.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame043.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame044.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame044.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame045.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame045.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame046.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame046.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame047.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame047.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame048.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame048.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame049.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame049.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame050.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame050.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame051.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame051.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame052.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame052.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame053.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame053.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame054.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame054.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame055.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame055.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame056.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame056.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame057.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame057.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame058.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame058.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame059.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame059.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame060.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame060.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame061.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame061.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame062.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame062.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame063.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame063.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame064.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame064.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame065.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame065.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame066.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame066.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame067.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame067.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame068.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame068.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame069.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame069.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame070.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame070.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame071.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame071.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame072.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame072.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame073.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame073.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame074.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame074.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame075.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame075.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame076.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame076.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame077.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame077.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame078.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame078.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame079.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame079.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame080.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame080.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame081.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame081.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame082.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame082.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame083.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame083.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame084.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame084.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame085.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame085.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame086.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame086.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame087.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame087.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame088.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame088.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame089.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame089.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame090.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame090.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame091.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame091.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame092.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame092.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame093.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame093.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame094.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame094.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame095.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame095.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame096.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame096.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame097.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame097.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame098.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame098.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame099.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame099.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame100.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame100.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame101.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame101.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame102.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame102.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame103.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame103.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame104.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame104.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame105.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame105.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame106.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame106.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame107.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame107.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame108.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame108.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame109.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame109.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame110.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame110.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame111.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame111.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame112.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame112.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame113.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame113.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame114.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame114.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame115.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame115.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame116.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame116.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame117.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame117.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame118.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame118.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame119.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame119.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame120.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame120.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame121.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame121.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame122.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame122.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame123.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame123.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame124.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame124.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame125.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame125.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame126.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame126.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame127.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame127.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame128.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame128.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame129.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame129.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame130.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame130.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame131.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame131.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame132.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame132.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame133.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame133.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame134.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame134.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame135.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame135.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame136.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame136.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame137.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame137.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame138.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame138.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame139.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame139.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame140.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame140.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame141.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame141.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame142.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame142.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame143.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame143.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame144.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame144.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame145.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame145.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame146.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame146.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame147.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame147.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame148.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame148.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame149.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame149.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame150.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame150.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame151.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame151.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame152.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame152.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame153.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame153.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame154.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame154.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame155.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame155.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame156.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame156.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame157.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame157.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame158.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame158.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame159.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame159.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame160.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame160.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame161.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame161.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame162.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame162.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame163.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame163.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame164.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame164.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame165.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame165.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame166.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame166.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame167.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame167.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame168.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame168.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame169.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame169.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame170.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame170.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame171.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame171.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame172.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame172.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame173.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame173.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame174.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame174.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame175.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame175.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame176.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame176.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/frame177.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/frame177.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pes-video1/raw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pes-video1/raw -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/pmt.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/pmt.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/sdt.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/sdt.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/muxer/ts/table-header.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/muxer/ts/table-header.ts -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/utils/av/audio/opus/opus.csd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/utils/av/audio/opus/opus.csd -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/utils/av/descriptors/es.descriptor: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/utils/av/descriptors/es.descriptor -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/utils/av/video/AVCDecoderConfigurationRecord: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/utils/av/video/AVCDecoderConfigurationRecord -------------------------------------------------------------------------------- /core/src/test/resources/test-samples/utils/av/video/HEVCDecoderConfigurationRecord: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/core/src/test/resources/test-samples/utils/av/video/HEVCDecoderConfigurationRecord -------------------------------------------------------------------------------- /demos/camera/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demos/camera/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /demos/camera/src/main/java/io/github/thibaultbee/streampack/app/models/FileExtension.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.app.models 2 | 3 | enum class FileExtension(val extension: String) { 4 | TS(".ts"), 5 | FLV(".flv"), 6 | MP4(".mp4"), 7 | WEBM(".webm"), 8 | OGG(".ogg"), 9 | THREEGP(".3gp"); 10 | 11 | companion object { 12 | fun fromEndpointType(endpointType: EndpointType): FileExtension { 13 | return when (endpointType) { 14 | EndpointType.TS_FILE -> TS 15 | EndpointType.FLV_FILE -> FLV 16 | EndpointType.MP4_FILE -> MP4 17 | EndpointType.WEBM_FILE -> WEBM 18 | EndpointType.OGG_FILE -> OGG 19 | EndpointType.THREEGP_FILE -> THREEGP 20 | else -> throw IllegalArgumentException("Unknown extension: $endpointType") 21 | } 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /demos/camera/src/main/java/io/github/thibaultbee/streampack/app/utils/PermissionManager.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.app.utils 2 | 3 | import android.content.Context 4 | import android.content.pm.PackageManager 5 | import androidx.core.content.ContextCompat 6 | 7 | class PermissionManager { 8 | companion object { 9 | fun hasPermissions(context: Context, vararg permissions: String): Boolean = 10 | permissions.all { 11 | ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_cameraswitch_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_center_focus_strong_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_exposure_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_flash_on_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_mic_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_mic_off_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_more_vert_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_wb_auto_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_baseline_zoom_in_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_switch_camera_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/ic_toggle_mic_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/drawable/img_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/drawable/img_test.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/layout/main_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 20 | 21 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/layout/settings_activity.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/menu/actions.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/camera/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demos/camera/src/main/res/values/array.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 5 | 25 6 | 30 7 | 60 8 | 9 | 10 | 11 | Mono 12 | Stereo 13 | 14 | 15 | 16 | 17 | 16 18 | 19 | 12 20 | 21 | 22 | 23 | 24000 24 | 64000 25 | 128000 26 | 192000 27 | 28 | 29 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | 7 | -------------------------------------------------------------------------------- /demos/camera/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /demos/screenrecorder/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /demos/screenrecorder/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/java/io/github/thibaultbee/streampack/screenrecorder/models/Actions.kt: -------------------------------------------------------------------------------- 1 | package io.github.thibaultbee.streampack.screenrecorder.models 2 | 3 | enum class Actions(val value: String) { 4 | STOP("STOP") 5 | } -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/java/io/github/thibaultbee/streampack/screenrecorder/models/EndpointType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2022 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.screenrecorder.models 17 | 18 | enum class EndpointType(val id: Int) { 19 | SRT(0), 20 | RTMP(1); 21 | 22 | companion object { 23 | fun fromId(id: Int): EndpointType = entries.first { it.id == id } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/drawable/ic_baseline_more_vert_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/drawable/ic_baseline_notifications_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/drawable/ic_baseline_stop_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/menu/actions.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/demos/screenrecorder/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/values/array.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Mono 5 | Stereo 6 | 7 | 8 | 9 | 1 10 | 2 11 | 12 | 13 | 14 | 24 Kbps 15 | 64 Kbps 16 | 128 Kbps 17 | 192 Kbps 18 | 19 | 20 | 21 | 24000 22 | 64000 23 | 128000 24 | 192000 25 | 26 | 27 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /demos/screenrecorder/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | -------------------------------------------------------------------------------- /extensions/README.md: -------------------------------------------------------------------------------- 1 | # StreamPack extensions 2 | 3 | StreamPack extensions are modules that depend on external libraries to provide additional functionality. -------------------------------------------------------------------------------- /extensions/rtmp/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | alias(libs.plugins.kotlin.android) 4 | } 5 | 6 | description = "RTMP extension for StreamPack." 7 | 8 | configureAndroidLibrary() 9 | configurePublication() 10 | 11 | android { 12 | namespace = "io.github.thibaultbee.streampack.ext.rtmp" 13 | kotlinOptions { 14 | jvmTarget = "17" 15 | } 16 | } 17 | 18 | dependencies { 19 | implementation(project(":streampack-core")) 20 | 21 | implementation(libs.rtmpdroid) 22 | 23 | implementation(libs.kotlinx.coroutines.android) 24 | implementation(libs.androidx.core.ktx) 25 | 26 | testImplementation(libs.junit) 27 | 28 | androidTestImplementation(libs.androidx.test.rules) 29 | androidTestImplementation(libs.androidx.junit) 30 | androidTestImplementation(libs.kotlinx.coroutines.test) 31 | androidTestImplementation(libs.video.api.client) 32 | } 33 | -------------------------------------------------------------------------------- /extensions/rtmp/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /extensions/srt/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | alias(libs.plugins.kotlin.android) 4 | } 5 | 6 | description = "Secure Reliable Transport (SRT) extension for StreamPack." 7 | 8 | configureAndroidLibrary() 9 | configurePublication() 10 | 11 | android { 12 | namespace = "io.github.thibaultbee.streampack.ext.srt" 13 | kotlinOptions { 14 | jvmTarget = "17" 15 | } 16 | } 17 | 18 | dependencies { 19 | implementation(project(":streampack-core")) 20 | 21 | api(libs.srtdroid.ktx) 22 | 23 | implementation(libs.kotlinx.coroutines.android) 24 | implementation(libs.androidx.core.ktx) 25 | 26 | testImplementation(libs.junit) 27 | 28 | androidTestImplementation(libs.androidx.test.rules) 29 | androidTestImplementation(libs.androidx.junit) 30 | androidTestImplementation(libs.kotlinx.coroutines.test) 31 | androidTestImplementation(libs.video.api.client) 32 | } -------------------------------------------------------------------------------- /extensions/srt/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThibaultBee/StreamPack/c0002e97004edd00ac4598ea8590c28449edb266/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Mar 29 17:03:59 CEST 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /services/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /services/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | alias(libs.plugins.kotlin.android) 4 | } 5 | 6 | description = "Services components for StreamPack." 7 | 8 | configureAndroidLibrary() 9 | configurePublication() 10 | 11 | android { 12 | namespace = "io.github.thibaultbee.streampack.services" 13 | kotlinOptions { 14 | jvmTarget = "17" 15 | } 16 | } 17 | 18 | dependencies { 19 | implementation(project(":streampack-core")) 20 | 21 | api(libs.androidx.lifecycle.service) 22 | implementation(libs.androidx.core.ktx) 23 | } 24 | -------------------------------------------------------------------------------- /services/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /services/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /services/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google { 4 | content { 5 | includeGroupByRegex("com\\.android.*") 6 | includeGroupByRegex("com\\.google.*") 7 | includeGroupByRegex("androidx.*") 8 | } 9 | } 10 | mavenCentral() 11 | gradlePluginPortal() 12 | } 13 | } 14 | dependencyResolutionManagement { 15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 16 | repositories { 17 | google() 18 | mavenCentral() 19 | } 20 | } 21 | rootProject.name = "StreamPack" 22 | 23 | include(":demo-camera") 24 | project(":demo-camera").projectDir = File(rootDir, "demos/camera") 25 | include(":demo-screenrecorder") 26 | project(":demo-screenrecorder").projectDir = File(rootDir, "demos/screenrecorder") 27 | 28 | // For library modules 29 | apply(from = "settings.libs.gradle.kts") 30 | 31 | -------------------------------------------------------------------------------- /settings.libs.gradle.kts: -------------------------------------------------------------------------------- 1 | // StreamPack libraries 2 | include(":core") 3 | project(":core").name = "streampack-core" 4 | include(":ui") 5 | project(":ui").name = "streampack-ui" 6 | include(":services") 7 | project(":services").name = "streampack-services" 8 | 9 | // Extensions 10 | include(":extension-rtmp") 11 | project(":extension-rtmp").projectDir = File(rootDir, "extensions/rtmp") 12 | project(":extension-rtmp").name = "streampack-extension-rtmp" 13 | include(":extension-srt") 14 | project(":extension-srt").projectDir = File(rootDir, "extensions/srt") 15 | project(":extension-srt").name = "streampack-extension-srt" 16 | -------------------------------------------------------------------------------- /ui/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /ui/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | alias(libs.plugins.kotlin.android) 4 | } 5 | 6 | description = "UI components for StreamPack." 7 | 8 | configureAndroidLibrary() 9 | configurePublication() 10 | 11 | android { 12 | namespace = "io.github.thibaultbee.streampack.ui" 13 | kotlinOptions { 14 | jvmTarget = "17" 15 | } 16 | } 17 | 18 | dependencies { 19 | implementation(project(":streampack-core")) 20 | 21 | implementation(libs.androidx.lifecycle.runtime) 22 | implementation(libs.androidx.camera.viewfinder.view) 23 | implementation(libs.kotlinx.coroutines.android) 24 | implementation(libs.androidx.core.ktx) 25 | implementation(libs.guava) 26 | } 27 | -------------------------------------------------------------------------------- /ui/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /ui/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ui/src/main/java/io/github/thibaultbee/streampack/ui/views/ViewExtensions.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2024 Thibault B. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package io.github.thibaultbee.streampack.ui.views 17 | 18 | import android.util.Size 19 | import android.view.View 20 | 21 | /** 22 | * Gets view size 23 | */ 24 | internal val View.size: Size 25 | get() = Size(width, height) 26 | -------------------------------------------------------------------------------- /ui/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | --------------------------------------------------------------------------------