Opened 11 years ago
Closed 8 years ago
#12047 closed Patch - Bug Fix (Abandoned)
mythplayer picks the wrong fps for 1080i matroska, degrading to 1xHW deint
Reported by: | Owned by: | Karl Egly | |
---|---|---|---|
Priority: | major | Milestone: | |
Component: | MythTV - Video Playback | Version: | Master Head |
Severity: | high | Keywords: | deinterlace mkv 1080i |
Cc: | Ticket locked: | no |
Description
mythplayer chooses to use the avg_fps (50) instead of the codec_fps (25) for 1080i matroska movies, therefor mythplayer decides to degrade deinterlacing to max 1xHW.
The problem is most clearly with a movie with extreme horizontal panning. I have a movie which I want to archive in mkv (lossless_cut) with a view on a large Chinese dragon wall.
Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : High@L4.0 Format settings, CABAC : Yes Format settings, ReFrames : 4 frames Format settings, GOP : M=4, N=28 Codec ID : V_MPEG4/ISO/AVC Bit rate : 2 884 Kbps Width : 1 920 pixels Height : 1 080 pixels Display aspect ratio : 16:9 Frame rate mode : Variable Original frame rate : 25.000 fps Standard : Component Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Interlaced Scan order : Bottom Field First
CoreContext avformatdecoder.cpp:1247 (normalized_fps) - AFD: Selected FPS is 50 (avg 50 codec 25 container 1000 estimated 50)
Setting primary deinterlacing option (2xHW):
CoreContext videodisplayprofile.cpp:354 (GetFilteredDeint) - VDP: GetFilteredDeint() : vdpau -> 'vdpaubasicdoublerate'
Degrade to fallback deinterlacing option (max 1xHW):
CoreContext mythplayer.cpp:2384 (VideoStart) - Player(0): Video sync method can't support double framerate (refresh rate too low for 2x deint) CoreContext videodisplayprofile.cpp:354 (GetFilteredDeint) - VDP: GetFilteredDeint(vdpauadvanced) : vdpau -> 'vdpauadvanced'
Mythplayer should use the codec_fps, which is correct for 1080i.
The following dirty patch fixes the problem:
diff --git a/mythtv/libs/libmythtv/avformatdecoder.cpp b/mythtv/libs/libmythtv/avformatdecoder.cpp index 3a42b40..6698484 100644 --- a/mythtv/libs/libmythtv/avformatdecoder.cpp +++ b/mythtv/libs/libmythtv/avformatdecoder.cpp @@ -1221,7 +1221,11 @@ float AvFormatDecoder::normalized_fps(AVStream *stream, AVCodecContext *enc) // matroska demuxer sets the default_duration to avg_frame_rate // mov,mp4,m4a,3gp,3g2,mj2 demuxer sets avg_frame_rate - if ((QString(ic->iformat->name).contains("matroska") || + if ((QString(ic->iformat->name).contains("matroska")) && + container_fps < 121.0f && container_fps > 3.0f) + fps = container_fps; + else + if ((QString(ic->iformat->name).contains("xmatroska") || QString(ic->iformat->name).contains("mov")) && avg_fps < 121.0f && avg_fps > 3.0f) fps = avg_fps;
Attachments (5)
Change History (19)
comment:1 Changed 11 years ago by
Milestone: | unknown → 0.28 |
---|---|
Priority: | minor → major |
Changed 11 years ago by
Attachment: | 0002-divide-framerate-by-number-of-ticks-fields-per-frame.patch added |
---|
comment:2 Changed 11 years ago by
Status: | new → infoneeded_new |
---|
comment:3 Changed 11 years ago by
Patch didn't compile on 0.27 and master:
avformatdecoder.cpp: In member function ‘float AvFormatDecoder::normalized_fps(AVStream*, AVCodecContext*)’: avformatdecoder.cpp:1351:13: error: ‘st’ was not declared in this scope
Changed 'st' to 'stream' and tested on 0.27-fixes.
The patch works for media as the one shown above.
I didn't had good luck with lossless_cut (uses mkvmerge) and 1080i material with minimal glitches, so I changed my workflow in the meantime and use ts-doctor (which at the end produces correct total times and proper FFWD) and avconv.
I don't have the original chinese wall recording anymore and the resulting mkv has been converted with the following:
avconv -y -i input-tsdoctor.mpg -r 25 -c:v libx264 -flags +ilme+ildct+loop -cmp chroma -deblock 0:0 -r 25 -bt 256k -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x -g 250 -keyint_min 25 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -qcomp 0.6 -qdiff 4 -refs 2 -direct-pred 1 -wpredp 2 -rc_lookahead 30 -profile:v baseline -level 30 -bf 0 -coder 0 -crf 22 -qmin 2 -qmax 30 -b:v 5000K -c:a copy -ar 44100 -ac 2 -b:a 128K -map 0:0 -map 0:a:0 -sn -f matroska output.mkv
which produces MBAFF
General Unique ID : 63265251044264927949292968836987650338 (0x2F9871B35334230A54E4639435FC8122) Complete name : Die sieben Wunder Chinas S01E06 Die Verbotene Stadt.mkv Format : Matroska Format version : Version 2 File size : 1.69 GiB Duration : 23mn 59s Overall bit rate : 10.1 Mbps Writing application : Lavf53.21.1 Writing library : Lavf53.21.1 Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : Main@L3.0 Format settings, CABAC : No Format settings, ReFrames : 2 frames Codec ID : V_MPEG4/ISO/AVC Duration : 23mn 59s Bit rate : 9 489 Kbps Width : 1 920 pixels Height : 1 080 pixels Display aspect ratio : 16:9 Frame rate mode : Constant Frame rate : 25.000 fps Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : MBAFF Bits/(Pixel*Frame) : 0.183 Stream size : 1.59 GiB (94%) Writing library : x264 core 120 r2151 a3f4407 Encoding settings : cabac=0 / ref=2 / deblock=1:0:0 / analyse=0x1:0x1 / me=umh / subme=5 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 / threads=12 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=tff / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=30 / rc=crf / mbtree=1 / crf=22.0 / qcomp=0.60 / qpmin=2 / qpmax=30 / qpstep=4 / ip_ratio=1.41 / aq=1:1.00 Default : Yes Forced : No
Your patch produces for MBAFF media the wrong FPS, interlacing is detected correctly:
CoreContext avformatdecoder.cpp:1256 (normalized_fps) - AFD: Selected FPS is 12.5 (avg 12.5 codec 25 container 1000 estimated 25 ticks_per_frame 2) CoreContext mythplayer.cpp:1748 (SetFrameInterval) - Player(6): SetFrameInterval ps:1 scan:3 CoreContext mythplayer.cpp:670 (detectInterlace) - Player(6): detectInterlace(Detect Scan, Interlaced Scan, 12.5, 1080) ->Interlaced Scan
For MBAFF no patch is needed, my patch does not interfere.
OT: I searched for other tools other than mediainfo to inspect the interlace status, but couldn't find one showing interlacing for MBAFF media, any suggestions.
OT: Is MBAFF good, or should I use another avconv command, any suggestions.
comment:4 Changed 11 years ago by
Thanks for testing. Sorry, I noticed the copy'n'paste error only after uploading the patch but forgot to upload the fixed patch :/ A quick search for MBAFF (mixed progressive and interlaced in within a frame) and ticks_per_frame leads to suggestion of "do not encode to interlaced unless your display really is interlaced" hints, see http://mewiki.project357.com/wiki/X264_Settings#tff OT: As you are reencoding the video you might as well deinterlace before encoding. Lets try with ffmpeg's own new helper function in the new patch. (this time its compile tested)
Changed 11 years ago by
Attachment: | 0001-divide-framerate-by-number-of-ticks-fields-per-frame.patch added |
---|
comment:5 Changed 11 years ago by
Owner: | set to Karl Egly |
---|
comment:6 Changed 11 years ago by
All 1080i movies play correct, although I cannot tell the deinterlacing qualities as the best example I have is the chinese wall movie which I only have in MBAFF, which .
CoreContext avformatdecoder.cpp:1291 (normalized_fps) - AFD: Selected FPS is 25 (guess 25 avg 25 codec 25 container 1000 estimated 25) CoreContext mythplayer.cpp:1748 (SetFrameInterval) - Player(0): SetFrameInterval ps:1 scan:3 CoreContext mythplayer.cpp:670 (detectInterlace) - Player(0): detectInterlace(Detect Scan, Interlaced Scan, 25, 1080) ->Interlaced Scan
However, I noticed converted with lossless_cut workflow media, plays correct, but deinterlacing is degraded and the debug information shows "misleading" data:
Unique ID : 215050711015139973841239614612672134380 (0xA1C942A8F50B9E98D99CE20C4FF4BCEC) Complete name : lossless_cut.mkv Format : Matroska Format version : Version 4 / Version 2 File size : 2.16 GiB Duration : 44mn 54s Overall bit rate : 6 879 Kbps Encoded date : UTC 2014-04-27 09:49:24 Writing application : mkvmerge v6.9.1 ('Blue Panther') 64bit built on Apr 18 2014 17:43:56 Writing library : libebml v1.3.0 + libmatroska v1.4.1 Video ID : 1 Format : AVC Format/Info : Advanced Video Codec Format profile : High@L4.0 Format settings, CABAC : Yes Format settings, ReFrames : 3 frames Codec ID : V_MPEG4/ISO/AVC Bit rate : 6 358 Kbps Width : 1 920 pixels Height : 1 080 pixels Display aspect ratio : 16:9 Frame rate mode : Variable Original frame rate : 25.000 fps Standard : Component Color space : YUV Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Interlaced Scan order : Top Field First Default : Yes Forced : No Color primaries : BT.709 Transfer characteristics : BT.709 Matrix coefficients : BT.709
CoreContext avformatdecoder.cpp:1291 (normalized_fps) - AFD: Selected FPS is 50 (guess 50 avg 50 codec 25 container 1000 estimated 50) CoreContext mythplayer.cpp:1748 (SetFrameInterval) - Player(1): SetFrameInterval ps:1 scan:3 CoreContext mythplayer.cpp:670 (detectInterlace) - Player(1): detectInterlace(Detect Scan, Interlaced Scan, 50, 1080) ->Progressive Scan ... CoreContext mythplayer.cpp:3907 (ClearAfterSeek) - Player(7): ClearAfterSeek(0) CoreContext mythxdisplay.cpp:201 (GetRefreshRate) - Doubling refresh rate for interlaced display. CoreContext videodisplayprofile.cpp:354 (GetFilteredDeint) - VDP: GetFilteredDeint() : vdpau -> 'vdpaubasicdoublerate' CoreContext videoout_vdpau.cpp:350 (SetupDeinterlace) - VidOutVDPAU: Enabled deinterlacing. CoreContext vsync.cpp:265 (TryInit) - VSYNC: DRMVideoSync: Could not open device /dev/dri/card0, No such file or directory CoreContext mythplayer.cpp:2384 (VideoStart) - Player(7): Video sync method can't support double framerate (refresh rate too low for 2x deint) CoreContext videodisplayprofile.cpp:354 (GetFilteredDeint) - VDP: GetFilteredDeint(vdpauadvanced) : vdpau -> 'vdpauadvanced' CoreContext videoout_vdpau.cpp:350 (SetupDeinterlace) - VidOutVDPAU: Enabled deinterlacing. CoreContext mythxdisplay.cpp:201 (GetRefreshRate) - Doubling refresh rate for interlaced display. CoreContext mythplayer.cpp:1780 (InitAVSync) - Player(7): Video timing method: RTC CoreContext mythplayer.cpp:1784 (InitAVSync) - Player(7): Display Refresh Rate: 60.053 Video Frame Rate: 50.000
Never saw two different fps values. Deinterlacing is correctly detected during playback.
In playback debug: Video:1920x1080@50fps, FPS: 25.00fps In Video Scan: detect(I)
OT: Thanks for the links: https://trac.bunkus.org/wiki/FAQ:WrongFrameRateDisplayed: which explains the mkv behaviour and the mediainfo peculiarities, but also does not suggest other tools.
http://mewiki.project357.com/wiki/X264_Settings#tff I have a 1080i display. Deinterlacing to 1080p or 720p didn't give me good results. Using vdpau 2xdeinterlacing is the best. Thats the reason I detected the deinterlacing degradation for mkv.
comment:7 Changed 11 years ago by
Hi Karl, I found a backup of the original Chinese wall recording (between 03:40-04:20). If you are interested please sent me a PM, I will make it available on my web server.
comment:8 Changed 11 years ago by
Hello Karl, I see the issue is on info needed. I can not give you further infos. I can provide you with a test file as written above.
Changed 11 years ago by
Attachment: | 0001-use-av_guess_frame_rate-from-ffmpeg-2.2-to-replace-o.patch added |
---|
comment:9 Changed 11 years ago by
Hi Angela, I did not understand if the patch fixed the issue without introducing a regression. Here's an updated version of the patch attachment:0001-use-av_guess_frame_rate-from-ffmpeg-2.2-to-replace-o.patch
comment:10 Changed 11 years ago by
Hi Karl, no, the patch does not fix the issue, when the mkv contains scan type interlaced. I have a file converted with avconv, which works, scan type MBAFF. A file converted with lossless_cut does not work, scan type interlaced.
I rerun the test with both files before and after the 0001-divide-framerate-by-number-of-ticks-fields-per-frame.patch on 0.27.1
The documented log files are attached below. I can provide the original ts and the two converted mkv files on my web server, please PM.
Changed 11 years ago by
Attachment: | chinesewall_avconv_5min.mkv.log added |
---|
Changed 11 years ago by
Attachment: | chinesewall_lossless_cut_5min.mkv.log added |
---|
comment:11 Changed 11 years ago by
Status: | infoneeded_new → new |
---|
comment:12 Changed 9 years ago by
Milestone: | 0.28 |
---|
comment:13 Changed 8 years ago by
Works in 0.28-fixes correct:
CoreContext avformatdecoder.cpp:1456 (normalized_fps) - AFD: Selected FPS is 25 (avg 25 codec 25 container 1000 estimated 25) CoreContext mythplayer.cpp:685 (detectInterlace) - Player(0): detectInterlace(Detect Scan, Interlaced Scan, 25, 1080) ->Interlaced Scan CoreContext videodisplayprofile.cpp:354 (GetFilteredDeint) - VDP: GetFilteredDeint() : vdpau -> 'vdpaubasicdoublerate'
In playback debug: Video:1920x1080@25fps, FPS: 25.00fps
In Video Scan: detect(I)
2xHW Deinterlace
Issue can be closed.
comment:14 Changed 8 years ago by
Resolution: | → Abandoned |
---|---|
Status: | new → closed |
thank you for reporting back
Good catch, but can't we simply use av_guess_frame_rate which handles interlaced content, too? Either way, the attached patch should handle both progressive and interlaced content. Does it fix your issue?