[FFmpeg-user] "corrupt decoded frame"
Mark Filipak
markfilipak.imdb at gmail.com
Thu Aug 14 21:19:37 EEST 2025
On 14/08/2025 02.55, Paul B Mahol via ffmpeg-user wrote:
> see -xerror flag ?
>
> On Wed, Aug 13, 2025 at 10:08 PM Mark Filipak <markfilipak.imdb at gmail.com>
> wrote:
>
>> Here are two notices out of hundreds like them. They are in an FFREPORT
>> log.
>>
>> =====
>> [h264 @ 00000000198b8040] concealing 7744 DC, 7744 AC, 7744 MV errors in
>> P frame
>>
>> [vist#0:0/h264 @ 0000000006fc2e00] [dec:h264 @ 0000000005a0fc80] corrupt
>> decoded frame
>> =====
>>
>> FFmpeg continued as though nothing had happened. The resulting video had
>> some seriously f'ed-up frames.
>>
>> The lines above are seen only if one makes and views an FFREPORT log.
>>
>> To state this clearly: When such errors happen, I want FFmpeg to tell
>> me, and I want FFmpeg to immediately stop, abort. How can I get FFmpeg
>> to do that? to do what I want? to stop and tell me?
>> see -xerror flag ?
I tried it. It's too blunt an instrument, Paul. It aborts on even
trivial errors. Let me explain...
You see below that I copy in two steps. Step 1 remuxes. Step 2
transcodes. The commands are below.
The reason I take two steps is that a single step, from disc directly to
transcode always fails. Why does it fail? I don't remember except that
it's very serious.
Step 1, the remux, generates hundreds of "Non-monotonic DTS" warnings,
every time, for every BD. I think it's an FFmpeg bug but I'm not willing
to argue about it anymore.
It's a bug or every BD I own has Non-monotonic DTSes.
With -xerror, the first "Non-monotonic DTS" warning aborts, so Step 1
always fails.
Two steps always succeeds except for 'A MAN CALLED OTTO'. We suspect
that my copy of 'A MAN CALLED OTTO' fails because it employs a new
flavor of AACS or of BD+ -- that of course has nothing to do with
"Non-monotonic DTS", real or bug.
So, you see, there's two things going on. There's "Non-monotonic DTS"
warnings -- real or bug -- and there's a new flavor of AACS or of BD+.
Source Target
0:a:1 a:0 2.0 DD dialog
0:a:0 a:1 5.1 DTS-HDMA dialog
0:s:0 s:0 subtitles
echo Step 1 : Make a copy of the m2ts.
set _NAME_=A MAN CALLED OTTO [2022]
set _GET_=h:\BDMV\STREAM\00001.m2ts
set _PUT_=g:\%_NAME_%.m2ts
set FFREPORT=file=%_NAME_%.1.ffreport.txt
set _JOB_=c:\work\%_NAME_%
c: & cd c:\work\
set _COPYv_=-map 0:v:0 -c:v:0 copy
set _CODEa0_=-map "[a]" -c:a:0 ac3 -disposition:a:0 0
set _COPYa1_=-map 0:a:0 -c:a:1 copy -disposition:a:1 0
set _COPYs_=-map 0:s:0 -c:s:0 copy
:
set _PREP_=-analyzeduration 500000000 -probesize 500000000
-start_at_zero -copyts -dn -fix_sub_duration
set _IS_CINEMA_=-r 24000/1001
: bsf:v
set _NO_CC_=filter_units=remove_types=6
: filter_complex
set _TO_HDR10_=-pix_fmt yuv420p10le
set _TO_SDR_=-pix_fmt yuv420p
set _TO_STEREO_=pan=stereo^|FL^<FL+FC+LFE+SL^|FR^<FR+FC+LFE+SR
:
start "%_NAME_% Step 1" cmd /k ffmpeg %_PREP_% %_IS_CINEMA_%^
-i "%_GET_%"^
-bsf:v "%_NO_CC_%"^
-filter_complex "[0:a:1]%_TO_STEREO_%[a]"^
%_COPYv_% %_CODEa0_% %_COPYa1_% %_COPYs_% "%_PUT_%"
echo Step 2 : Make the final m2ts.
set _NAME_=A MAN CALLED OTTO [2022]
set _GET_=g:\%_NAME_%.m2ts
set _PUT_=e:\Movies2\%_NAME_%.m2ts
set FFREPORT=file=%_NAME_%.2.ffreport.txt
set _JOB_=c:\work\%_NAME_%
c: & cd c:\work\
set _CODEv_=-map 0:v:0 -c:v:0 libx264 -x264-params
8x8dct=1:analyse=0x3,0x133:aq-mode=1:aq-strength=1.0:b-adapt=2:b-bias=0:b-pyramid=2:bframes=5:bitrate=2850:bluray-compat=0:cabac=1:chroma-me=1:chroma-qp-offset=-2:constrained-intra=0:cplxblur=20.0:cqm=flat:deadzone-inter=21:deadzone-intra=11:deblock=1,-1,-1:direct=auto:fast-pskip=0:filler=0:interlaced=0:intra-refresh=0:ipratio=1.40:keyint-min=23:keyint=240:lookahead-threads=3:mbtree=1:me=umh:merange=30:nal-hrd=none:nr=0:open-gop=0:psy-rd=1.00,0.00:psy=1:qblur=0.5:qcomp=0.60:qpmax=69:qpmin=1:qpstep=4:ratetol=1.0:rc-lookahead=50:ref=5:scenecut=40:sliced-threads=0:slices=4:subme=7:threads=12:trellis=1:vbv-bufsize=78125:vbv-maxrate=62500:weightb=1:weightp=2
set _COPYa0_=-map 0:a:0 -c:a:0 copy -disposition:a:0 0
set _COPYa1_=-map 0:a:1 -c:a:1 copy -disposition:a:1 0
set _COPYs_=-map 0:s:0 -c:s:0 copy
:
set _PREP_=-analyzeduration 500000000 -probesize 500000000
-start_at_zero -copyts -dn
set _IS_CINEMA_=-r 24000/1001
: bsf:v
set _H264_GET_=h264_redundant_pps
: filter_complex
set _TO_HDR10_=-pix_fmt yuv420p10le
set _TO_SDR_=-pix_fmt yuv420p
:
start "%_NAME_% Step 2" cmd /k ffmpeg %_PREP_% %_IS_CINEMA_%^
-i "%_GET_%"^
-bsf:v "%_H264_GET_%"^
%_CODEv_% %_COPYa0_% %_COPYa1_% %_COPYs_% "%_PUT_%"
More information about the ffmpeg-user
mailing list