mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-05-31 21:08:27 +01:00
Add MediaStream.ReferenceFrameRate for problematic video files (#12603)
Co-authored-by: Nyanmisaka <nst799610810@gmail.com>
This commit is contained in:
@@ -810,7 +810,7 @@ namespace MediaBrowser.Model.Dlna
|
||||
if (options.AllowVideoStreamCopy)
|
||||
{
|
||||
// prefer direct copy profile
|
||||
float videoFramerate = videoStream?.AverageFrameRate ?? videoStream?.RealFrameRate ?? 0;
|
||||
float videoFramerate = videoStream?.ReferenceFrameRate ?? 0;
|
||||
TransportStreamTimestamp? timestamp = videoStream is null ? TransportStreamTimestamp.None : item.Timestamp;
|
||||
int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio);
|
||||
int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video);
|
||||
@@ -875,7 +875,7 @@ namespace MediaBrowser.Model.Dlna
|
||||
playlistItem.VideoCodecs = videoCodecs;
|
||||
|
||||
// Copy video codec options as a starting point, this applies to transcode and direct-stream
|
||||
playlistItem.MaxFramerate = videoStream?.AverageFrameRate;
|
||||
playlistItem.MaxFramerate = videoStream?.ReferenceFrameRate;
|
||||
var qualifier = videoStream?.Codec;
|
||||
if (videoStream?.Level is not null)
|
||||
{
|
||||
@@ -949,7 +949,7 @@ namespace MediaBrowser.Model.Dlna
|
||||
double? videoLevel = videoStream?.Level;
|
||||
string? videoProfile = videoStream?.Profile;
|
||||
VideoRangeType? videoRangeType = videoStream?.VideoRangeType;
|
||||
float videoFramerate = videoStream is null ? 0 : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate ?? 0;
|
||||
float videoFramerate = videoStream is null ? 0 : videoStream.ReferenceFrameRate ?? 0;
|
||||
bool? isAnamorphic = videoStream?.IsAnamorphic;
|
||||
bool? isInterlaced = videoStream?.IsInterlaced;
|
||||
string? videoCodecTag = videoStream?.CodecTag;
|
||||
@@ -1208,7 +1208,7 @@ namespace MediaBrowser.Model.Dlna
|
||||
double? videoLevel = videoStream?.Level;
|
||||
string? videoProfile = videoStream?.Profile;
|
||||
VideoRangeType? videoRangeType = videoStream?.VideoRangeType;
|
||||
float videoFramerate = videoStream is null ? 0 : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate ?? 0;
|
||||
float videoFramerate = videoStream is null ? 0 : videoStream.ReferenceFrameRate ?? 0;
|
||||
bool? isAnamorphic = videoStream?.IsAnamorphic;
|
||||
bool? isInterlaced = videoStream?.IsInterlaced;
|
||||
string? videoCodecTag = videoStream?.CodecTag;
|
||||
|
||||
@@ -217,7 +217,7 @@ namespace MediaBrowser.Model.Dlna
|
||||
var stream = TargetVideoStream;
|
||||
return MaxFramerate.HasValue && !IsDirectStream
|
||||
? MaxFramerate
|
||||
: stream is null ? null : stream.AverageFrameRate ?? stream.RealFrameRate;
|
||||
: stream?.ReferenceFrameRate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -525,6 +525,23 @@ namespace MediaBrowser.Model.Entities
|
||||
/// <value>The real frame rate.</value>
|
||||
public float? RealFrameRate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the framerate used as reference.
|
||||
/// Prefer AverageFrameRate, if that is null or an unrealistic value
|
||||
/// then fallback to RealFrameRate.
|
||||
/// </summary>
|
||||
/// <value>The reference frame rate.</value>
|
||||
public float? ReferenceFrameRate
|
||||
{
|
||||
get
|
||||
{
|
||||
// In some cases AverageFrameRate for videos will be read as 1000fps even if it is not.
|
||||
// This is probably due to a library compatability issue.
|
||||
// See https://github.com/jellyfin/jellyfin/pull/12603#discussion_r1748044018 for more info.
|
||||
return AverageFrameRate < 1000 ? AverageFrameRate : RealFrameRate;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the profile.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user