Skip to content

feat(video): add VideoPipeline, VideoFormatOption, and InputFormat.VIDEO#3768

Open
Itsxenonli wants to merge 42 commits into
docling-project:mainfrom
Itsxenonli:feat/video-pipeline
Open

feat(video): add VideoPipeline, VideoFormatOption, and InputFormat.VIDEO#3768
Itsxenonli wants to merge 42 commits into
docling-project:mainfrom
Itsxenonli:feat/video-pipeline

Conversation

@Itsxenonli

Copy link
Copy Markdown
Contributor

Add InputFormat.VIDEO with extensions [mp4, avi, mov, mkv, webm] and video MIME types, moved out of InputFormat.AUDIO. Add VideoFormatOption and register it in DocumentConverter. Add VideoPipeline that extracts audio via ffmpeg, transcribes via the shared ASR transcriber, samples frames using FixedIntervalFrameSampler or SimpleSceneChangeFrameSampler, and merges transcript + frames by timestamp into a DoclingDocument. Add VideoFrameSamplingMode enum and VideoPipelineOptions.

33 routing tests pass.

Checklist:

  • Documentation has been updated, if necessary.
  • Examples have been added, if necessary.
  • Tests have been added, if necessary.

Add InputFormat.VIDEO with extensions [mp4, avi, mov, mkv, webm] and
video MIME types, moved out of InputFormat.AUDIO. Add VideoFormatOption
and register it in DocumentConverter. Add VideoPipeline that extracts
audio via ffmpeg, transcribes via the shared ASR transcriber, samples
frames using FixedIntervalFrameSampler or SimpleSceneChangeFrameSampler,
and merges transcript + frames by timestamp into a DoclingDocument.
Add VideoFrameSamplingMode enum and VideoPipelineOptions.

33 routing tests pass.

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
@Itsxenonli Itsxenonli marked this pull request as draft July 7, 2026 08:51
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

DCO Check Passed

Thanks @Itsxenonli, all your commits are properly signed off. 🎉

@mergify

mergify Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Merge Protections

🟢 Merge protection satisfied — ready to merge.

Show 1 satisfied protection

🟢 Enforce conventional commit

Make sure that we follow https://www.conventionalcommits.org/en/v1.0.0/

  • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert)(?:\(.+\))?(!)?:

@codecov

codecov Bot commented Jul 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 27.80749% with 270 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
docling/pipeline/video_pipeline.py 23.35% 105 Missing ⚠️
docling/utils/speaker_diarization.py 21.62% 87 Missing ⚠️
docling/utils/video_frame_sampling.py 18.18% 63 Missing ⚠️
docling/cli/main.py 0.00% 15 Missing ⚠️

📢 Thoughts on this report? Let us know!

…dation

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
…video_document_to_html

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
… sharpness scoring

Replace SimpleSceneChangeFrameSampler fixed threshold with scipy
find_peaks prominence-based local peak detection. Self-calibrates per
video, no manual threshold config needed. Add sharpness scoring via
Laplacian variance to pick the sharpest keyframe per scene, avoiding
motion-blurred frames during pans. Update VideoPipelineOptions to use
scene_change_prominence instead of scene_change_threshold.

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
…ction

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
@Itsxenonli Itsxenonli marked this pull request as ready for review July 8, 2026 11:23
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
…-interval, --video-cuts-per-minute, --video-prominence

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
…-help hint

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
@Itsxenonli Itsxenonli force-pushed the feat/video-pipeline branch from 2e492b2 to f298e02 Compare July 8, 2026 13:43
…r count

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: Nikolaos Bekas <bekas.nikolaoszug@gmail.com>
…n flag

Signed-off-by: Nikolaos Bekas <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
…d webrtcvad deadlock after Whisper

Signed-off-by: Nikolaos Bekas <bekas.nikolaoszug@gmail.com>
…ly set

Signed-off-by: Nikolaos Bekas <bekas.nikolaoszug@gmail.com>
Comment thread docling/cli/main.py Outdated
Comment thread docling/pipeline/asr_transcriber.py Outdated
Comment thread docling/pipeline/video_pipeline.py Outdated
Comment thread docling/utils/speaker_diarization.py
…xporter

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
…led by docling-core serializer)

Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: Itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: Itsxenonli <bekas.nikolaoszug@gmail.com>
Comment thread docs/examples/video_pipeline.ipynb
Comment thread docling/datamodel/pipeline_options.py Outdated
Comment thread docling/datamodel/pipeline_options.py Outdated
Comment thread docling/utils/speaker_diarization.py Outdated
Comment thread docling/pipeline/video_pipeline.py Outdated
Comment thread docling/utils/speaker_diarization.py Outdated
Comment thread docling/utils/speaker_diarization.py Outdated
Comment thread docling/utils/video_frame_sampling.py
Comment on lines +28 to +30
def test_input_format_video_exists():
assert hasattr(InputFormat, "VIDEO")
assert InputFormat.VIDEO.value == "video"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a trivially self-validating test. Some more meaningful routing tests, like the MIME parametrized checks, are fine but the trivial ones, like this one, should be removed.

Comment thread docling/cli/main.py Outdated
Itsxenonli and others added 5 commits July 14, 2026 15:19
Co-authored-by: Cesar Berrospi Ramis <75900930+ceberam@users.noreply.github.com>
Signed-off-by: Nikolaos Bekas <bekas.nikolaoszug@gmail.com>
Signed-off-by: Itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: Itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: Itsxenonli <bekas.nikolaoszug@gmail.com>
Signed-off-by: Itsxenonli <bekas.nikolaoszug@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants