- Apply timestamp normalization to all transcodes, not just Progressive
- Use /downloads/ folder for all full-file downloads, not just Progressive
- Fixes MKV streaming issues with timestamps
- Add TranscodingType == Progressive check to downloads folder condition
- Add TranscodingType == Progressive check to timestamp normalization
- Only applies fixes to actual progressive downloads, not all streaming
- Prevents affecting live TV, HLS playback, and other streaming scenarios
- Downloads folder: use for ANY request without SegmentContainer (not just Progressive)
- Timestamp normalization: apply whenever CopyTimestamps=false (not just Progressive)
- Removes overly restrictive conditions that prevented fixes from working
- Should now work for all download scenarios
- Log SegmentContainer, Context, TranscodingType in StreamingHelpers
- Log TranscodingType, CopyTimestamps, OutputContainer in EncodingHelper
- Debug why downloads not using /downloads/ folder
- Debug why timestamps not being normalized
- Move -avoid_negative_ts to global output options
- Was only applied to video stream, now applies to both video and audio
- Fixes audio start_time being negative (-0.036) while video was at 0
- Ensures both streams start at timestamp 0 for proper seeking
- Add frag_keyframe for fragment-based seeking
- Add default_base_moof for proper base decode time
- Keep faststart for metadata at file start
- Fixes seeking/timestamp issues in mpv player
The previous commit referenced state.Request.SegmentContainer which doesn't
exist. BaseEncodingJobOptions doesn't have a SegmentContainer property - only
StreamingRequestDto does.
Fixed by:
- Cast BaseRequest to StreamingRequestDto before accessing SegmentContainer
- Add using directive for MediaBrowser.Controller.Streaming namespace
- Use null-conditional operator to safely check SegmentContainer
Use faststart instead of fragmented MP4 flags for non-segmented streams.
This fixes seeking and duration metadata in downloaded transcoded files.
When transcoding for download (no segment container), MP4 files now use
the faststart movflag which moves the moov atom to the beginning of the
file. This enables:
- Proper duration metadata for video players
- Accurate time display and seeking
- Better compatibility with standard video players
Fragmented MP4 flags (frag_keyframe+empty_moov+delay_moov) are still
used for adaptive streaming (HLS/DASH) where segment containers are specified.
- FFmpeg suppresses progress output (fps, time, bitrate) when loglevel is set to error
- Add -stats flag to force progress updates regardless of log level
- Fixes dashboard not showing transcode info (codec, progress, etc.)
- Add FfmpegLogLevel property to EncodingOptions (default: 'error')
- Use configuration value in GetInputModifier instead of hardcoded value
- Allows changing log verbosity without rebuild via encoding.xml
- Possible values: quiet, panic, fatal, error, warning, info, verbose, debug, trace
- Set FFmpeg loglevel to 'error' to suppress repetitive warnings like 'Skipping NAL unit'
- Add client IP and User-Agent to exception middleware logging for better debugging
* Cleanup extracted files
* Pagination and fixes
* Add migration for attachments to MigrateLibraryDb
* Unify attachment handling
* Don't extract again if files were already extracted
* Fix MKS attachment extraction
* Always run full extraction on mks
* Don't try to extract mjpeg streams as attachments
* Fallback to check if attachments were extracted to cache folder
* Fixup
* Add support for bitstream filter to remove dynamic hdr metadata
* Add support for ffprobe's only_first_vframe for HDR10+ detection
* Add BitStreamFilterOptionType for metadata removal check
* Map HDR10+ metadata to VideoRangeType.cs
Current implementation uses a hack that abuses the EL flag to avoid database schema changes. Should add proper field once EFCore migration is merged.
* Add more Dolby Vision Range types
Out of spec ones are problematic and should be marked as a dedicated invalid type and handled by the server to not crash the player.
Profile 7 videos should not be treated as normal HDR10 videos at all and should remove the metadata before serving.
* Remove dynamic hdr metadata when necessary
* Allow direct playback of HDR10+ videos on HDR10 clients
* Only use dovi codec tag when dovi metadata is not removed
* Handle DV Profile 7 Videos better
* Fix HDR10+ with new bitmask
* Indicate the presence of HDR10+ in HLS SUPPLEMENTAL-CODECS
* Fix Dovi 8.4 not labeled as HLG in HLS
* Fallback to dovi_rpu bsf for av1 when possible
* Fix dovi_rpu cli for av1
* Use correct EFCore db column for HDR10+
* Undo outdated migration
* Add proper hdr10+ migration
* Remove outdated migration
* Rebase to new db code
* Add migrations for Hdr10PlusPresentFlag
* Directly use bsf enum
* Add xmldocs for SupportsBitStreamFilterWithOption
* Make `VideoRangeType.Unknown` explicitly default on api models.
* Unset default for non-api model class
* Use tuples for bsf dictionary for now