├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app-debug.apk ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── estrongs │ │ └── android │ │ └── pop │ │ └── video │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── estrongs │ │ │ └── android │ │ │ └── pop │ │ │ └── video │ │ │ ├── BaseFragment.java │ │ │ ├── IUI.java │ │ │ ├── MainActivity.java │ │ │ ├── MyApplication.java │ │ │ ├── edit │ │ │ ├── EditCacheManager.java │ │ │ ├── EditFragment.java │ │ │ ├── EditManager.java │ │ │ ├── cut │ │ │ │ ├── CutActivity.java │ │ │ │ ├── CutFragment.java │ │ │ │ └── CutManager.java │ │ │ ├── muxer │ │ │ │ ├── Audio.java │ │ │ │ ├── AudioDecoder.java │ │ │ │ ├── AudioEncoder.java │ │ │ │ ├── IMuxerController.java │ │ │ │ ├── MediaError.java │ │ │ │ ├── MediaHelper.java │ │ │ │ ├── Muxer.java │ │ │ │ ├── OverlayEffect.java │ │ │ │ ├── ProgressListener.java │ │ │ │ ├── TextureRender.java │ │ │ │ ├── Video.java │ │ │ │ ├── VideoDecoder.java │ │ │ │ └── VideoEncoder.java │ │ │ ├── overlay │ │ │ │ ├── DrawOverlayView.java │ │ │ │ ├── OverlayDrawer.java │ │ │ │ └── OverlayView.java │ │ │ └── view │ │ │ │ └── frames │ │ │ │ ├── VideoFrameExtractor.java │ │ │ │ ├── VideoFrames.java │ │ │ │ └── VideoFramesView.java │ │ │ ├── filter │ │ │ ├── IVideoFilter.java │ │ │ └── VideoFilterProvider.java │ │ │ ├── opengl │ │ │ ├── EGLHelper.java │ │ │ ├── FrameRender.java │ │ │ ├── GLHelper.java │ │ │ ├── OverlayRender.java │ │ │ └── RenderHelper.java │ │ │ ├── player │ │ │ └── VideoTimeBar.java │ │ │ └── util │ │ │ ├── AndroidUtil.java │ │ │ ├── BitmapUtil.java │ │ │ ├── DensityUtil.java │ │ │ └── FileUtil.java │ └── res │ │ ├── drawable │ │ ├── chevron_left.png │ │ ├── fengj.png │ │ └── icon_handle_transparent.png │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── cut.xml │ │ ├── fragment_cut.xml │ │ ├── fragment_edit.xml │ │ ├── video_player_controls.xml │ │ └── video_player_view.xml │ │ ├── menu │ │ └── menu_main.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 │ │ ├── raw │ │ ├── simple_fragment_shader2.glsl │ │ ├── simple_vertex_shader2.glsl │ │ ├── videoeditor_fragment_shader.glsl │ │ └── videoeditor_verctex_shader.glsl │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── estrongs │ └── android │ └── pop │ └── video │ └── ExampleUnitTest.java ├── build.gradle ├── exoplayer_core ├── .gitignore ├── build.gradle └── src │ ├── androidTest │ ├── AndroidManifest.xml │ ├── assets │ │ ├── flv │ │ │ ├── sample.flv │ │ │ └── sample.flv.0.dump │ │ ├── mkv │ │ │ ├── sample.mkv │ │ │ ├── sample.mkv.0.dump │ │ │ ├── sample.mkv.1.dump │ │ │ ├── sample.mkv.2.dump │ │ │ ├── sample.mkv.3.dump │ │ │ ├── subsample_encrypted_altref.webm │ │ │ ├── subsample_encrypted_altref.webm.0.dump │ │ │ ├── subsample_encrypted_noaltref.webm │ │ │ └── subsample_encrypted_noaltref.webm.0.dump │ │ ├── mp3 │ │ │ ├── bear.mp3 │ │ │ ├── bear.mp3.0.dump │ │ │ ├── bear.mp3.1.dump │ │ │ ├── bear.mp3.2.dump │ │ │ ├── bear.mp3.3.dump │ │ │ ├── play-trimmed.mp3 │ │ │ ├── play-trimmed.mp3.0.dump │ │ │ ├── play-trimmed.mp3.1.dump │ │ │ ├── play-trimmed.mp3.2.dump │ │ │ ├── play-trimmed.mp3.3.dump │ │ │ └── play-trimmed.mp3.unklen.dump │ │ ├── mp4 │ │ │ ├── sample.mp4 │ │ │ ├── sample.mp4.0.dump │ │ │ ├── sample.mp4.1.dump │ │ │ ├── sample.mp4.2.dump │ │ │ ├── sample.mp4.3.dump │ │ │ ├── sample_fragmented.mp4 │ │ │ ├── sample_fragmented.mp4.0.dump │ │ │ ├── sample_fragmented_sei.mp4 │ │ │ ├── sample_fragmented_sei.mp4.0.dump │ │ │ └── sample_fragmented_zero_size_atom.mp4 │ │ ├── ogg │ │ │ ├── bear.opus │ │ │ ├── bear.opus.0.dump │ │ │ ├── bear.opus.1.dump │ │ │ ├── bear.opus.2.dump │ │ │ ├── bear.opus.3.dump │ │ │ ├── bear.opus.unklen.dump │ │ │ ├── bear_flac.ogg │ │ │ ├── bear_flac.ogg.0.dump │ │ │ ├── bear_flac.ogg.1.dump │ │ │ ├── bear_flac.ogg.2.dump │ │ │ ├── bear_flac.ogg.3.dump │ │ │ ├── bear_flac.ogg.unklen.dump │ │ │ ├── bear_flac_noseektable.ogg │ │ │ ├── bear_flac_noseektable.ogg.0.dump │ │ │ ├── bear_flac_noseektable.ogg.1.dump │ │ │ ├── bear_flac_noseektable.ogg.2.dump │ │ │ ├── bear_flac_noseektable.ogg.3.dump │ │ │ ├── bear_flac_noseektable.ogg.unklen.dump │ │ │ ├── bear_vorbis.ogg │ │ │ ├── bear_vorbis.ogg.0.dump │ │ │ ├── bear_vorbis.ogg.1.dump │ │ │ ├── bear_vorbis.ogg.2.dump │ │ │ ├── bear_vorbis.ogg.3.dump │ │ │ └── bear_vorbis.ogg.unklen.dump │ │ ├── rawcc │ │ │ ├── sample.rawcc │ │ │ └── sample.rawcc.0.dump │ │ ├── subrip │ │ │ ├── empty │ │ │ ├── no_end_timecodes │ │ │ ├── typical │ │ │ ├── typical_extra_blank_line │ │ │ ├── typical_missing_sequence │ │ │ ├── typical_missing_timecode │ │ │ ├── typical_negative_timestamps │ │ │ └── typical_with_byte_order_mark │ │ ├── ts │ │ │ ├── sample.ac3 │ │ │ ├── sample.ac3.0.dump │ │ │ ├── sample.adts │ │ │ ├── sample.adts.0.dump │ │ │ ├── sample.ps │ │ │ ├── sample.ps.0.dump │ │ │ ├── sample.ts │ │ │ ├── sample.ts.0.dump │ │ │ └── sample_with_sdt.ts │ │ ├── ttml │ │ │ ├── chain_multiple_styles.xml │ │ │ ├── font_size.xml │ │ │ ├── font_size_empty.xml │ │ │ ├── font_size_invalid.xml │ │ │ ├── font_size_no_unit.xml │ │ │ ├── frame_rate.xml │ │ │ ├── inherit_and_override_style.xml │ │ │ ├── inherit_global_and_parent.xml │ │ │ ├── inherit_multiple_styles.xml │ │ │ ├── inherit_style.xml │ │ │ ├── inline_style_attributes.xml │ │ │ ├── multiple_regions.xml │ │ │ └── no_underline_linethrough.xml │ │ ├── tx3g │ │ │ ├── initialization │ │ │ ├── initialization_all_defaults │ │ │ ├── no_subtitle │ │ │ ├── sample_just_text │ │ │ ├── sample_utf16_be_no_styl │ │ │ ├── sample_utf16_le_no_styl │ │ │ ├── sample_with_multiple_styl │ │ │ ├── sample_with_other_extension │ │ │ ├── sample_with_styl │ │ │ ├── sample_with_styl_all_defaults │ │ │ └── sample_with_tbox │ │ ├── wav │ │ │ ├── sample.wav │ │ │ ├── sample.wav.0.dump │ │ │ ├── sample.wav.1.dump │ │ │ ├── sample.wav.2.dump │ │ │ └── sample.wav.3.dump │ │ ├── webm │ │ │ └── vorbis_codec_private │ │ └── webvtt │ │ │ ├── empty │ │ │ ├── typical │ │ │ ├── typical_with_comments │ │ │ ├── typical_with_identifiers │ │ │ ├── with_bad_cue_header │ │ │ ├── with_css_complex_selectors │ │ │ ├── with_css_styles │ │ │ ├── with_positioning │ │ │ └── with_tags │ └── java │ │ └── com │ │ └── google │ │ └── android │ │ └── exoplayer2 │ │ ├── CTest.java │ │ ├── ExoPlayerTest.java │ │ ├── FormatTest.java │ │ ├── drm │ │ ├── DrmInitDataTest.java │ │ └── OfflineLicenseHelperTest.java │ │ ├── extractor │ │ ├── DefaultExtractorInputTest.java │ │ ├── ExtractorTest.java │ │ ├── flv │ │ │ └── FlvExtractorTest.java │ │ ├── mkv │ │ │ ├── DefaultEbmlReaderTest.java │ │ │ ├── MatroskaExtractorTest.java │ │ │ └── VarintReaderTest.java │ │ ├── mp3 │ │ │ ├── Mp3ExtractorTest.java │ │ │ └── XingSeekerTest.java │ │ ├── mp4 │ │ │ ├── AtomParsersTest.java │ │ │ ├── FragmentedMp4ExtractorTest.java │ │ │ └── Mp4ExtractorTest.java │ │ ├── ogg │ │ │ ├── DefaultOggSeekerTest.java │ │ │ ├── DefaultOggSeekerUtilMethodsTest.java │ │ │ ├── OggExtractorTest.java │ │ │ ├── OggPacketTest.java │ │ │ ├── OggPageHeaderTest.java │ │ │ ├── OggTestFile.java │ │ │ ├── TestData.java │ │ │ ├── VorbisBitArrayTest.java │ │ │ ├── VorbisReaderTest.java │ │ │ └── VorbisUtilTest.java │ │ ├── rawcc │ │ │ └── RawCcExtractorTest.java │ │ ├── ts │ │ │ ├── Ac3ExtractorTest.java │ │ │ ├── AdtsExtractorTest.java │ │ │ ├── AdtsReaderTest.java │ │ │ ├── PsExtractorTest.java │ │ │ ├── SectionReaderTest.java │ │ │ └── TsExtractorTest.java │ │ └── wav │ │ │ └── WavExtractorTest.java │ │ ├── metadata │ │ ├── emsg │ │ │ ├── EventMessageDecoderTest.java │ │ │ └── EventMessageTest.java │ │ ├── id3 │ │ │ ├── ChapterFrameTest.java │ │ │ ├── ChapterTocFrameTest.java │ │ │ └── Id3DecoderTest.java │ │ └── scte35 │ │ │ └── SpliceInfoDecoderTest.java │ │ ├── source │ │ └── ClippingMediaSourceTest.java │ │ ├── text │ │ ├── subrip │ │ │ └── SubripDecoderTest.java │ │ ├── ttml │ │ │ ├── TtmlDecoderTest.java │ │ │ ├── TtmlRenderUtilTest.java │ │ │ └── TtmlStyleTest.java │ │ ├── tx3g │ │ │ └── Tx3gDecoderTest.java │ │ └── webvtt │ │ │ ├── CssParserTest.java │ │ │ ├── Mp4WebvttDecoderTest.java │ │ │ ├── WebvttCueParserTest.java │ │ │ ├── WebvttDecoderTest.java │ │ │ └── WebvttSubtitleTest.java │ │ ├── upstream │ │ ├── ByteArrayDataSourceTest.java │ │ ├── DataSourceInputStreamTest.java │ │ ├── cache │ │ │ ├── CacheDataSourceTest.java │ │ │ ├── CacheDataSourceTest2.java │ │ │ ├── CachedContentIndexTest.java │ │ │ ├── CachedRegionTrackerTest.java │ │ │ ├── SimpleCacheSpanTest.java │ │ │ └── SimpleCacheTest.java │ │ └── crypto │ │ │ └── AesFlushingCipherTest.java │ │ └── util │ │ ├── AtomicFileTest.java │ │ ├── ColorParserTest.java │ │ ├── NalUnitUtilTest.java │ │ ├── ParsableByteArrayTest.java │ │ ├── ParsableNalUnitBitArrayTest.java │ │ ├── ReusableBufferedOutputStreamTest.java │ │ ├── UriUtilTest.java │ │ └── UtilTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── google │ │ └── android │ │ └── exoplayer2 │ │ ├── BaseRenderer.java │ │ ├── C.java │ │ ├── DefaultLoadControl.java │ │ ├── DefaultRenderersFactory.java │ │ ├── ExoPlaybackException.java │ │ ├── ExoPlayer.java │ │ ├── ExoPlayerFactory.java │ │ ├── ExoPlayerImpl.java │ │ ├── ExoPlayerImplInternal.java │ │ ├── ExoPlayerLibraryInfo.java │ │ ├── Format.java │ │ ├── FormatHolder.java │ │ ├── IllegalSeekPositionException.java │ │ ├── LoadControl.java │ │ ├── ParserException.java │ │ ├── PlaybackParameters.java │ │ ├── Renderer.java │ │ ├── RendererCapabilities.java │ │ ├── RendererConfiguration.java │ │ ├── RenderersFactory.java │ │ ├── SimpleExoPlayer.java │ │ ├── Timeline.java │ │ ├── audio │ │ ├── Ac3Util.java │ │ ├── AudioCapabilities.java │ │ ├── AudioCapabilitiesReceiver.java │ │ ├── AudioDecoderException.java │ │ ├── AudioProcessor.java │ │ ├── AudioRendererEventListener.java │ │ ├── AudioTrack.java │ │ ├── ChannelMappingAudioProcessor.java │ │ ├── DtsUtil.java │ │ ├── MediaCodecAudioRenderer.java │ │ ├── ResamplingAudioProcessor.java │ │ ├── SimpleDecoderAudioRenderer.java │ │ ├── Sonic.java │ │ └── SonicAudioProcessor.java │ │ ├── decoder │ │ ├── Buffer.java │ │ ├── CryptoInfo.java │ │ ├── Decoder.java │ │ ├── DecoderCounters.java │ │ ├── DecoderInputBuffer.java │ │ ├── OutputBuffer.java │ │ ├── SimpleDecoder.java │ │ └── SimpleOutputBuffer.java │ │ ├── drm │ │ ├── DecryptionException.java │ │ ├── DefaultDrmSessionManager.java │ │ ├── DrmInitData.java │ │ ├── DrmSession.java │ │ ├── DrmSessionManager.java │ │ ├── ExoMediaCrypto.java │ │ ├── ExoMediaDrm.java │ │ ├── FrameworkMediaCrypto.java │ │ ├── FrameworkMediaDrm.java │ │ ├── HttpMediaDrmCallback.java │ │ ├── KeysExpiredException.java │ │ ├── MediaDrmCallback.java │ │ ├── OfflineLicenseHelper.java │ │ ├── UnsupportedDrmException.java │ │ └── WidevineUtil.java │ │ ├── extractor │ │ ├── ChunkIndex.java │ │ ├── DefaultExtractorInput.java │ │ ├── DefaultExtractorsFactory.java │ │ ├── DefaultTrackOutput.java │ │ ├── DummyTrackOutput.java │ │ ├── Extractor.java │ │ ├── ExtractorInput.java │ │ ├── ExtractorOutput.java │ │ ├── ExtractorsFactory.java │ │ ├── GaplessInfoHolder.java │ │ ├── MpegAudioHeader.java │ │ ├── PositionHolder.java │ │ ├── SeekMap.java │ │ ├── TrackOutput.java │ │ ├── flv │ │ │ ├── AudioTagPayloadReader.java │ │ │ ├── FlvExtractor.java │ │ │ ├── ScriptTagPayloadReader.java │ │ │ ├── TagPayloadReader.java │ │ │ └── VideoTagPayloadReader.java │ │ ├── mkv │ │ │ ├── DefaultEbmlReader.java │ │ │ ├── EbmlReader.java │ │ │ ├── EbmlReaderOutput.java │ │ │ ├── MatroskaExtractor.java │ │ │ ├── Sniffer.java │ │ │ └── VarintReader.java │ │ ├── mp3 │ │ │ ├── ConstantBitrateSeeker.java │ │ │ ├── Mp3Extractor.java │ │ │ ├── VbriSeeker.java │ │ │ └── XingSeeker.java │ │ ├── mp4 │ │ │ ├── Atom.java │ │ │ ├── AtomParsers.java │ │ │ ├── DefaultSampleValues.java │ │ │ ├── FixedSampleSizeRechunker.java │ │ │ ├── FragmentedMp4Extractor.java │ │ │ ├── MetadataUtil.java │ │ │ ├── Mp4Extractor.java │ │ │ ├── PsshAtomUtil.java │ │ │ ├── Sniffer.java │ │ │ ├── Track.java │ │ │ ├── TrackEncryptionBox.java │ │ │ ├── TrackFragment.java │ │ │ └── TrackSampleTable.java │ │ ├── ogg │ │ │ ├── DefaultOggSeeker.java │ │ │ ├── FlacReader.java │ │ │ ├── OggExtractor.java │ │ │ ├── OggPacket.java │ │ │ ├── OggPageHeader.java │ │ │ ├── OggSeeker.java │ │ │ ├── OpusReader.java │ │ │ ├── StreamReader.java │ │ │ ├── VorbisBitArray.java │ │ │ ├── VorbisReader.java │ │ │ └── VorbisUtil.java │ │ ├── rawcc │ │ │ └── RawCcExtractor.java │ │ ├── ts │ │ │ ├── Ac3Extractor.java │ │ │ ├── Ac3Reader.java │ │ │ ├── AdtsExtractor.java │ │ │ ├── AdtsReader.java │ │ │ ├── DefaultTsPayloadReaderFactory.java │ │ │ ├── DtsReader.java │ │ │ ├── DvbSubtitleReader.java │ │ │ ├── ElementaryStreamReader.java │ │ │ ├── H262Reader.java │ │ │ ├── H264Reader.java │ │ │ ├── H265Reader.java │ │ │ ├── Id3Reader.java │ │ │ ├── MpegAudioReader.java │ │ │ ├── NalUnitTargetBuffer.java │ │ │ ├── PesReader.java │ │ │ ├── PsExtractor.java │ │ │ ├── SectionPayloadReader.java │ │ │ ├── SectionReader.java │ │ │ ├── SeiReader.java │ │ │ ├── SpliceInfoSectionReader.java │ │ │ ├── TsExtractor.java │ │ │ └── TsPayloadReader.java │ │ └── wav │ │ │ ├── WavExtractor.java │ │ │ ├── WavHeader.java │ │ │ └── WavHeaderReader.java │ │ ├── mediacodec │ │ ├── MediaCodecInfo.java │ │ ├── MediaCodecRenderer.java │ │ ├── MediaCodecSelector.java │ │ └── MediaCodecUtil.java │ │ ├── metadata │ │ ├── Metadata.java │ │ ├── MetadataDecoder.java │ │ ├── MetadataDecoderException.java │ │ ├── MetadataDecoderFactory.java │ │ ├── MetadataInputBuffer.java │ │ ├── MetadataRenderer.java │ │ ├── emsg │ │ │ ├── EventMessage.java │ │ │ └── EventMessageDecoder.java │ │ ├── id3 │ │ │ ├── ApicFrame.java │ │ │ ├── BinaryFrame.java │ │ │ ├── ChapterFrame.java │ │ │ ├── ChapterTocFrame.java │ │ │ ├── CommentFrame.java │ │ │ ├── GeobFrame.java │ │ │ ├── Id3Decoder.java │ │ │ ├── Id3Frame.java │ │ │ ├── PrivFrame.java │ │ │ ├── TextInformationFrame.java │ │ │ └── UrlLinkFrame.java │ │ └── scte35 │ │ │ ├── PrivateCommand.java │ │ │ ├── SpliceCommand.java │ │ │ ├── SpliceInfoDecoder.java │ │ │ ├── SpliceInsertCommand.java │ │ │ ├── SpliceNullCommand.java │ │ │ ├── SpliceScheduleCommand.java │ │ │ └── TimeSignalCommand.java │ │ ├── source │ │ ├── AdaptiveMediaSourceEventListener.java │ │ ├── BehindLiveWindowException.java │ │ ├── ClippingMediaPeriod.java │ │ ├── ClippingMediaSource.java │ │ ├── CompositeSequenceableLoader.java │ │ ├── ConcatenatingMediaSource.java │ │ ├── EmptySampleStream.java │ │ ├── ExtractorMediaPeriod.java │ │ ├── ExtractorMediaSource.java │ │ ├── LoopingMediaSource.java │ │ ├── MediaPeriod.java │ │ ├── MediaSource.java │ │ ├── MergingMediaPeriod.java │ │ ├── MergingMediaSource.java │ │ ├── SampleStream.java │ │ ├── SequenceableLoader.java │ │ ├── SinglePeriodTimeline.java │ │ ├── SingleSampleMediaPeriod.java │ │ ├── SingleSampleMediaSource.java │ │ ├── TrackGroup.java │ │ ├── TrackGroupArray.java │ │ ├── UnrecognizedInputFormatException.java │ │ └── chunk │ │ │ ├── BaseMediaChunk.java │ │ │ ├── BaseMediaChunkOutput.java │ │ │ ├── Chunk.java │ │ │ ├── ChunkExtractorWrapper.java │ │ │ ├── ChunkHolder.java │ │ │ ├── ChunkSampleStream.java │ │ │ ├── ChunkSource.java │ │ │ ├── ChunkedTrackBlacklistUtil.java │ │ │ ├── ContainerMediaChunk.java │ │ │ ├── DataChunk.java │ │ │ ├── InitializationChunk.java │ │ │ ├── MediaChunk.java │ │ │ └── SingleSampleMediaChunk.java │ │ ├── text │ │ ├── CaptionStyleCompat.java │ │ ├── Cue.java │ │ ├── SimpleSubtitleDecoder.java │ │ ├── SimpleSubtitleOutputBuffer.java │ │ ├── Subtitle.java │ │ ├── SubtitleDecoder.java │ │ ├── SubtitleDecoderException.java │ │ ├── SubtitleDecoderFactory.java │ │ ├── SubtitleInputBuffer.java │ │ ├── SubtitleOutputBuffer.java │ │ ├── TextRenderer.java │ │ ├── cea │ │ │ ├── Cea608Decoder.java │ │ │ ├── Cea708Cue.java │ │ │ ├── Cea708Decoder.java │ │ │ ├── CeaDecoder.java │ │ │ ├── CeaOutputBuffer.java │ │ │ ├── CeaSubtitle.java │ │ │ └── CeaUtil.java │ │ ├── dvb │ │ │ ├── DvbDecoder.java │ │ │ ├── DvbParser.java │ │ │ └── DvbSubtitle.java │ │ ├── subrip │ │ │ ├── SubripDecoder.java │ │ │ └── SubripSubtitle.java │ │ ├── ttml │ │ │ ├── TtmlDecoder.java │ │ │ ├── TtmlNode.java │ │ │ ├── TtmlRegion.java │ │ │ ├── TtmlRenderUtil.java │ │ │ ├── TtmlStyle.java │ │ │ └── TtmlSubtitle.java │ │ ├── tx3g │ │ │ ├── Tx3gDecoder.java │ │ │ └── Tx3gSubtitle.java │ │ └── webvtt │ │ │ ├── CssParser.java │ │ │ ├── Mp4WebvttDecoder.java │ │ │ ├── Mp4WebvttSubtitle.java │ │ │ ├── WebvttCssStyle.java │ │ │ ├── WebvttCue.java │ │ │ ├── WebvttCueParser.java │ │ │ ├── WebvttDecoder.java │ │ │ ├── WebvttParserUtil.java │ │ │ └── WebvttSubtitle.java │ │ ├── trackselection │ │ ├── AdaptiveTrackSelection.java │ │ ├── BaseTrackSelection.java │ │ ├── DefaultTrackSelector.java │ │ ├── FixedTrackSelection.java │ │ ├── MappingTrackSelector.java │ │ ├── RandomTrackSelection.java │ │ ├── TrackSelection.java │ │ ├── TrackSelectionArray.java │ │ ├── TrackSelector.java │ │ └── TrackSelectorResult.java │ │ ├── upstream │ │ ├── Allocation.java │ │ ├── Allocator.java │ │ ├── AssetDataSource.java │ │ ├── BandwidthMeter.java │ │ ├── ByteArrayDataSink.java │ │ ├── ByteArrayDataSource.java │ │ ├── ContentDataSource.java │ │ ├── DataSink.java │ │ ├── DataSource.java │ │ ├── DataSourceException.java │ │ ├── DataSourceInputStream.java │ │ ├── DataSpec.java │ │ ├── DefaultAllocator.java │ │ ├── DefaultBandwidthMeter.java │ │ ├── DefaultDataSource.java │ │ ├── DefaultDataSourceFactory.java │ │ ├── DefaultHttpDataSource.java │ │ ├── DefaultHttpDataSourceFactory.java │ │ ├── DummyDataSource.java │ │ ├── FileDataSource.java │ │ ├── FileDataSourceFactory.java │ │ ├── HttpDataSource.java │ │ ├── Loader.java │ │ ├── LoaderErrorThrower.java │ │ ├── ParsingLoadable.java │ │ ├── PriorityDataSource.java │ │ ├── PriorityDataSourceFactory.java │ │ ├── RawResourceDataSource.java │ │ ├── TeeDataSource.java │ │ ├── TransferListener.java │ │ ├── UdpDataSource.java │ │ ├── cache │ │ │ ├── Cache.java │ │ │ ├── CacheDataSink.java │ │ │ ├── CacheDataSinkFactory.java │ │ │ ├── CacheDataSource.java │ │ │ ├── CacheDataSourceFactory.java │ │ │ ├── CacheEvictor.java │ │ │ ├── CacheSpan.java │ │ │ ├── CacheUtil.java │ │ │ ├── CachedContent.java │ │ │ ├── CachedContentIndex.java │ │ │ ├── CachedRegionTracker.java │ │ │ ├── LeastRecentlyUsedCacheEvictor.java │ │ │ ├── NoOpCacheEvictor.java │ │ │ ├── SimpleCache.java │ │ │ └── SimpleCacheSpan.java │ │ └── crypto │ │ │ ├── AesCipherDataSink.java │ │ │ ├── AesCipherDataSource.java │ │ │ ├── AesFlushingCipher.java │ │ │ └── CryptoUtil.java │ │ ├── util │ │ ├── Assertions.java │ │ ├── AtomicFile.java │ │ ├── Clock.java │ │ ├── CodecSpecificDataUtil.java │ │ ├── ColorParser.java │ │ ├── ConditionVariable.java │ │ ├── FlacStreamInfo.java │ │ ├── LibraryLoader.java │ │ ├── LongArray.java │ │ ├── MediaClock.java │ │ ├── MimeTypes.java │ │ ├── NalUnitUtil.java │ │ ├── ParsableBitArray.java │ │ ├── ParsableByteArray.java │ │ ├── ParsableNalUnitBitArray.java │ │ ├── Predicate.java │ │ ├── PriorityTaskManager.java │ │ ├── ReusableBufferedOutputStream.java │ │ ├── SlidingPercentile.java │ │ ├── StandaloneMediaClock.java │ │ ├── SystemClock.java │ │ ├── TimestampAdjuster.java │ │ ├── TraceUtil.java │ │ ├── UriUtil.java │ │ ├── Util.java │ │ └── XmlPullParserUtil.java │ │ └── video │ │ ├── AvcConfig.java │ │ ├── ColorInfo.java │ │ ├── HevcConfig.java │ │ ├── MediaCodecVideoRenderer.java │ │ ├── VideoFrameReleaseTimeHelper.java │ │ └── VideoRendererEventListener.java │ └── javadoc │ └── com │ └── google │ └── android │ └── exoplayer2 │ └── doc-files │ ├── exoplayer-threading-model.svg │ ├── renderer-states.svg │ ├── timeline-advanced.svg │ ├── timeline-live-indefinite.svg │ ├── timeline-live-limited.svg │ ├── timeline-live-multi-period.svg │ ├── timeline-period.svg │ ├── timeline-playlist.svg │ ├── timeline-single-file.svg │ └── timeline-window.svg ├── exoplayer_ui ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── google │ │ └── android │ │ └── exoplayer2 │ │ └── ui │ │ ├── AspectRatioFrameLayout.java │ │ ├── DebugTextViewHelper.java │ │ ├── DefaultTimeBar.java │ │ ├── PlaybackControlView.java │ │ ├── SimpleExoPlayerView.java │ │ ├── SubtitlePainter.java │ │ ├── SubtitleView.java │ │ └── TimeBar.java │ └── res │ ├── drawable-anydpi-v21 │ ├── exo_controls_fastforward.xml │ ├── exo_controls_next.xml │ ├── exo_controls_pause.xml │ ├── exo_controls_play.xml │ ├── exo_controls_previous.xml │ └── exo_controls_rewind.xml │ ├── drawable-hdpi │ ├── exo_controls_fastforward.png │ ├── exo_controls_next.png │ ├── exo_controls_pause.png │ ├── exo_controls_play.png │ ├── exo_controls_previous.png │ └── exo_controls_rewind.png │ ├── drawable-ldpi │ ├── exo_controls_fastforward.png │ ├── exo_controls_next.png │ ├── exo_controls_pause.png │ ├── exo_controls_play.png │ ├── exo_controls_previous.png │ └── exo_controls_rewind.png │ ├── drawable-mdpi │ ├── exo_controls_fastforward.png │ ├── exo_controls_next.png │ ├── exo_controls_pause.png │ ├── exo_controls_play.png │ ├── exo_controls_previous.png │ └── exo_controls_rewind.png │ ├── drawable-xhdpi │ ├── exo_controls_fastforward.png │ ├── exo_controls_next.png │ ├── exo_controls_pause.png │ ├── exo_controls_play.png │ ├── exo_controls_previous.png │ └── exo_controls_rewind.png │ ├── drawable-xxhdpi │ ├── exo_controls_fastforward.png │ ├── exo_controls_next.png │ ├── exo_controls_pause.png │ ├── exo_controls_play.png │ ├── exo_controls_previous.png │ └── exo_controls_rewind.png │ ├── drawable │ └── exo_edit_mode_logo.xml │ ├── layout │ ├── exo_playback_control_view.xml │ └── exo_simple_player_view.xml │ ├── values-af │ └── strings.xml │ ├── values-am │ └── strings.xml │ ├── values-ar │ └── strings.xml │ ├── values-az-rAZ │ └── strings.xml │ ├── values-b+sr+Latn │ └── strings.xml │ ├── values-be-rBY │ └── strings.xml │ ├── values-bg │ └── strings.xml │ ├── values-bn-rBD │ └── strings.xml │ ├── values-bs-rBA │ └── strings.xml │ ├── values-ca │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-da │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-el │ └── strings.xml │ ├── values-en-rAU │ └── strings.xml │ ├── values-en-rGB │ └── strings.xml │ ├── values-en-rIN │ └── strings.xml │ ├── values-es-rUS │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-et-rEE │ └── strings.xml │ ├── values-eu-rES │ └── strings.xml │ ├── values-fa │ └── strings.xml │ ├── values-fi │ └── strings.xml │ ├── values-fr-rCA │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-gl-rES │ └── strings.xml │ ├── values-gu-rIN │ └── strings.xml │ ├── values-hi │ └── strings.xml │ ├── values-hr │ └── strings.xml │ ├── values-hu │ └── strings.xml │ ├── values-hy-rAM │ └── strings.xml │ ├── values-in │ └── strings.xml │ ├── values-is-rIS │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-iw │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-ka-rGE │ └── strings.xml │ ├── values-kk-rKZ │ └── strings.xml │ ├── values-km-rKH │ └── strings.xml │ ├── values-kn-rIN │ └── strings.xml │ ├── values-ko │ └── strings.xml │ ├── values-ky-rKG │ └── strings.xml │ ├── values-lo-rLA │ └── strings.xml │ ├── values-lt │ └── strings.xml │ ├── values-lv │ └── strings.xml │ ├── values-mk-rMK │ └── strings.xml │ ├── values-ml-rIN │ └── strings.xml │ ├── values-mn-rMN │ └── strings.xml │ ├── values-mr-rIN │ └── strings.xml │ ├── values-ms-rMY │ └── strings.xml │ ├── values-my-rMM │ └── strings.xml │ ├── values-nb │ └── strings.xml │ ├── values-ne-rNP │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-pa-rIN │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-pt │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-si-rLK │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sl │ └── strings.xml │ ├── values-sq-rAL │ └── strings.xml │ ├── values-sr │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-sw │ └── strings.xml │ ├── values-ta-rIN │ └── strings.xml │ ├── values-te-rIN │ └── strings.xml │ ├── values-th │ └── strings.xml │ ├── values-tl │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-ur-rPK │ └── strings.xml │ ├── values-uz-rUZ │ └── strings.xml │ ├── values-v11 │ └── styles.xml │ ├── values-vi │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rHK │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values-zu │ └── strings.xml │ └── values │ ├── attrs.xml │ ├── constants.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # videoEditor 2 | MediaCodec实现视频编辑 3 | 4 | 主要实现功能如下: 5 | 6 | 1. EXOPlayer播放 7 | 2. MediaCodec实现编解码视频 8 | 3. 剪切视频并通过MediaMuxer保存 9 | 3. 保存的时候,通过openGL添加一个背景 10 | 4. 背景随着当前视频播放时时变化 11 | 12 | [Demo下载](https://github.com/TryLoveCatch/videoEditor/blob/master/app-debug.apk?raw=true) 13 | -------------------------------------------------------------------------------- /app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TryLoveCatch/videoEditor/53ccac2253b221f59a53be09528b2085b94ced18/app-debug.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.3" 6 | defaultConfig { 7 | applicationId "com.estrongs.android.pop.video" 8 | minSdkVersion 21 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.3.1' 28 | // compile 'com.android.support:support-v4:25.3.1' 29 | compile 'com.android.support:design:25.3.1' 30 | testCompile 'junit:junit:4.12' 31 | compile project(path: ':exoplayer_ui') 32 | } 33 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\android\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/estrongs/android/pop/video/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.estrongs.android.pop.video", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/IUI.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video; 2 | 3 | interface IUI { 4 | 5 | /** 6 | * 初始化view属性,在此之前已通过ButterKnife初始化view 7 | * @Title: initViewProperty 8 | * @return void 9 | * @date Apr 18, 2014 11:00:56 AM 10 | */ 11 | void initViewProperty(); 12 | 13 | /** 14 | * 初始化数据请求相关 15 | * @Title: initData 16 | * @return void 17 | * @date Apr 24, 2014 10:38:59 AM 18 | */ 19 | void initData(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video; 2 | 3 | import com.estrongs.android.pop.video.util.AndroidUtil; 4 | 5 | import android.app.Application; 6 | 7 | /** 8 | * Created by lipeng21 on 2017/6/27. 9 | */ 10 | 11 | public class MyApplication extends Application{ 12 | 13 | public static MyApplication mInstance; 14 | 15 | @Override 16 | public void onCreate() { 17 | super.onCreate(); 18 | mInstance = this; 19 | AndroidUtil.init(this); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/edit/EditCacheManager.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.edit; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * Created by lipeng21 on 2017/6/27. 8 | */ 9 | 10 | public class EditCacheManager { 11 | private static volatile EditCacheManager mInstance; 12 | private Map mMapCaches; 13 | private EditCacheManager(){ 14 | mMapCaches = new HashMap<>(); 15 | } 16 | public static EditCacheManager getInstance(){ 17 | if(mInstance==null){ 18 | synchronized (EditCacheManager.class){ 19 | if(mInstance==null){ 20 | mInstance = new EditCacheManager(); 21 | } 22 | } 23 | } 24 | return mInstance; 25 | } 26 | 27 | public void addManager(String pSrcPath, EditManager pManager){ 28 | if(mMapCaches.containsKey(pSrcPath)){ 29 | throw new RuntimeException("该路径已经存在"); 30 | } 31 | 32 | mMapCaches.put(pSrcPath, pManager); 33 | } 34 | 35 | public EditManager getManager(String pSrcPath){ 36 | return mMapCaches.get(pSrcPath); 37 | } 38 | 39 | public void removeManager(String pSrcPath){ 40 | mMapCaches.remove(pSrcPath); 41 | } 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/edit/muxer/IMuxerController.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.edit.muxer; 2 | 3 | /** 4 | * Created by lipeng21 on 2017/6/28. 5 | */ 6 | 7 | public interface IMuxerController { 8 | 9 | boolean isDropFrame(long presentationTime); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/edit/muxer/MediaError.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.edit.muxer; 2 | 3 | /** 4 | * Created by lipeng21 on 2017/6/29. 5 | */ 6 | 7 | public class MediaError { 8 | public static final int CODE_NO_AUDIO = 1; 9 | public static final int CODE_NO_VIDEO = 2; 10 | public static final int CODE_UNKNOWN = -1; 11 | 12 | public int code; 13 | public String msg; 14 | 15 | public MediaError(String msg){ 16 | this.code = CODE_UNKNOWN; 17 | this.msg = msg; 18 | } 19 | public MediaError(int code, String msg){ 20 | this.code = code; 21 | this.msg = msg; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/edit/muxer/ProgressListener.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.edit.muxer; 2 | 3 | public interface ProgressListener { 4 | 5 | void onStart(); 6 | void onProgress(int progress); 7 | void onCompleted(); 8 | void onError(); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/edit/overlay/DrawOverlayView.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.edit.overlay; 2 | 3 | import java.util.List; 4 | 5 | import android.content.Context; 6 | import android.support.annotation.Nullable; 7 | import android.util.AttributeSet; 8 | import android.view.View; 9 | 10 | /** 11 | * Created by lipeng21 on 2017/6/30. 12 | */ 13 | 14 | public class DrawOverlayView extends View{ 15 | 16 | private List mArrViews; 17 | 18 | public DrawOverlayView(Context context) { 19 | super(context); 20 | } 21 | 22 | public DrawOverlayView(Context context, @Nullable AttributeSet attrs) { 23 | super(context, attrs); 24 | } 25 | 26 | public DrawOverlayView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 27 | super(context, attrs, defStyleAttr); 28 | } 29 | 30 | public DrawOverlayView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 31 | super(context, attrs, defStyleAttr, defStyleRes); 32 | } 33 | 34 | 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/edit/overlay/OverlayDrawer.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.edit.overlay; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.Paint; 5 | 6 | /** 7 | * 两个地方会调用 8 | * 9 | * 1、预览 10 | * 2、合成 11 | * 12 | * 所以需要传入Canvas,这样我只用画就可以 13 | * 不用关心是在那里绘制的 14 | * 15 | */ 16 | public interface OverlayDrawer { 17 | 18 | int DRAW_EMPTY = 0; 19 | int DRAW_SAME = 1; 20 | int DRAW_CHANGED = 2; 21 | 22 | int drawImage(long pts, Canvas canvas, Paint paint); 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/filter/IVideoFilter.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.filter; 2 | 3 | public interface IVideoFilter { 4 | void init(); 5 | int getProgram(); 6 | void applyFilter(long pts); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/filter/VideoFilterProvider.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.filter; 2 | 3 | public class VideoFilterProvider { 4 | 5 | public IVideoFilter getFilter(long pts) { 6 | return null; 7 | } 8 | 9 | public void initFilters() { 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/opengl/FrameRender.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.opengl; 2 | 3 | /** 4 | * Created by lipeng21 on 2017/6/28. 5 | */ 6 | 7 | public class FrameRender { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/opengl/OverlayRender.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.opengl; 2 | 3 | /** 4 | * Created by lipeng21 on 2017/6/28. 5 | */ 6 | 7 | public class OverlayRender { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/estrongs/android/pop/video/util/FileUtil.java: -------------------------------------------------------------------------------- 1 | package com.estrongs.android.pop.video.util; 2 | 3 | import java.io.File; 4 | 5 | public class FileUtil { 6 | 7 | public static boolean makeSureFolderOfFileExist(String path) { 8 | int pos = path.lastIndexOf("/"); 9 | String folder = path.substring(0, pos); 10 | return makeSureFolderExist(folder); 11 | } 12 | 13 | public static boolean makeSureFolderExist(String path) { 14 | File dir = new File(path); 15 | 16 | if (!dir.exists()) { 17 | return dir.mkdirs(); 18 | } else { 19 | return dir.isDirectory(); 20 | } 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chevron_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TryLoveCatch/videoEditor/53ccac2253b221f59a53be09528b2085b94ced18/app/src/main/res/drawable/chevron_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/fengj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TryLoveCatch/videoEditor/53ccac2253b221f59a53be09528b2085b94ced18/app/src/main/res/drawable/fengj.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_handle_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TryLoveCatch/videoEditor/53ccac2253b221f59a53be09528b2085b94ced18/app/src/main/res/drawable/icon_handle_transparent.png -------------------------------------------------------------------------------- /app/src/main/res/layout/cut.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 20 | 21 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |