Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/torchcodec/_core/SingleStreamDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ void SingleStreamDecoder::initialize_decoder() {
}

if (av_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
double fps = av_q2d(av_stream->r_frame_rate);
double fps = av_q2d(av_stream->avg_frame_rate);
if (fps > 0) {
stream_metadata.average_fps_from_header = fps;
}
Expand Down
Binary file added test/resources/nasa_13013_vfr.mp4
Binary file not shown.
30 changes: 30 additions & 0 deletions test/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import functools
from fractions import Fraction
from pathlib import Path

import pytest
from torchcodec import ffmpeg_major_version
Expand All @@ -20,9 +21,11 @@

from .utils import (
BT2020_LIMITED_RANGE_10BIT,
call_ffprobe,
NASA_AUDIO_MP3,
NASA_VIDEO,
NASA_VIDEO_ROTATED,
needs_ffmpeg_cli,
)


Expand Down Expand Up @@ -153,6 +156,33 @@ def test_get_metadata_audio_file(metadata_getter):
assert best_audio_stream_metadata.sample_format == "fltp"


@needs_ffmpeg_cli
def test_video_average_fps_uses_avg_frame_rate_not_r_frame_rate():
path = Path(__file__).parent / "resources" / "nasa_13013_vfr.mp4"

ffprobe_stream = call_ffprobe(
[
"-select_streams",
"v:0",
"-show_entries",
"stream=r_frame_rate,avg_frame_rate",
str(path),
]
)["streams"][0]
r_frame_rate = Fraction(ffprobe_stream["r_frame_rate"])
avg_frame_rate = Fraction(ffprobe_stream["avg_frame_rate"])
assert r_frame_rate != avg_frame_rate

metadata = get_container_metadata_from_header(path)

assert metadata.best_video_stream.average_fps_from_header == pytest.approx(
float(avg_frame_rate)
)
assert metadata.best_video_stream.average_fps_from_header != pytest.approx(
float(r_frame_rate)
)


def test_rotation_metadata():
"""Test that rotation metadata is correctly extracted for rotated video."""
# NASA_VIDEO_ROTATED has 90-degree rotation metadata
Expand Down