[FFmpeg-user] Faster ffprobe-based detection of open GOP h264 ?

Andrew Randrianasulu randrianasulu at gmail.com
Thu Jan 11 04:21:54 EET 2024


чт, 11 янв. 2024 г., 03:13 Andrew Randrianasulu <randrianasulu at gmail.com>:

> I was looking at videohelp forum
>
>
> https://web.archive.org/web/20201125203546/https://forum.videohelp.com/threads/398119-Cutting-Open-GOP-H264-videos-properly
>
> (web archive link because it hopefully will stay active for some time even
> if forum software will be upgraded and ruin old links in the future)
>
> It provides this ffprobe-based method of seeing if given h264 video stream
> is Open GOP or not :
>
> echo entry,pkt_pts_time,pict_type,coded_picture_number > "%~n1.csv"
>
> ffprobe -v 32 -stats -y -hide_banner -i %1 -select_streams v -print_format
> csv -of csv  -show_entries
> "frame=pkt_pts_time,pict_type,coded_picture_number" >> "%~n1.csv"
>
> === quote ====
>
> You can see that the last frame of the first GOP is a B frame -- so that's
> an open GOP. Also, the coded picture number is higher than that of the I
> frame after it -- indicating that the I frame had to be decoded before the
> B frame, another indication of an open GOP.
>
> === quote ends ===
>
> I checked one of my videos:
>
> ffprobe -v 32 -stats -y -hide_banner -i
> ~/Sea_of_life_plus_Mikura_dolphins_test.mp4 -select_streams v -print_format
> csv -of csv  -show_entries
> "frame=pkt_pts_time,pict_type,coded_picture_number" >> "Sea_of_life-n1.csv"
>
> and it seems resulting cvs file show it as open GOP consistently with
> mediainfo:
>
> frame,8.308300,B,250
> frame,8.341667,I,249
> frame,8.375033,B,253
>
> mediainfo (v23.11) snip:
>
> === snip ===
>
> Video
>
> ID                                       : 1
>
> Format                                   : AVC
>             Format/Info                              : Advanced Video
> Codec
>  Format profile                           : High at L4.1
> Format settings                          : 4 Ref Frames
>
> Format settings, CABAC                   : No
> Format settings, Reference frames        : 4 frames
>
>  Codec ID                                 : avc1
>
> Codec ID/Info                            : Advanced Video Coding
>
>  Duration                                 : 5 min 4 s
> Bit rate                                 : 16.0 Mb/s
> Width                                    : 1 920 pixels
>
> Height                                   : 1 080 pixels
>
> Display aspect ratio                     : 16:9
>
> Frame rate mode                          : Constant
>
> Frame rate                               : 29.970 (30000/1001) FPS
> Color space                              : YUV
>
> Chroma subsampling                       : 4:2:0
>
> Bit depth                                : 8 bits
>
> Scan type                                : Progressive
>
>  Bits/(Pixel*Frame)                       : 0.257
> Stream size                              : 575 MiB (99%)
>
> Writing library                          : x264 core 148
>
> Encoding settings                        : cabac=0 / ref=3 / deblock=1:0:0
> / analyse=0x3:0x113 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 /
> mixed_ref=1 / me_range=16 / chroma_me=0 / trellis=1 / 8x8dct=1 / cqm=0 /
> deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=3 /
> lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 /
> bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=0
> / b_bias=0 / direct=1 / weightb=1 / open_gop=1 / weightp=2 / keyint=250 /
> keyint_min=25 / scenecut=0 / intra_refresh=0 / rc_lookahead=40 / rc=abr /
> mbtree=1 / bitrate=16000 / ratetol=1.0 / qcomp=0.60 / qpmin=10 / qpmax=51 /
> qpstep=4 / ip_ratio=1.41 / aq=1:1.00
>
> Codec configuration box                  : avcC
>
> ==== snip ends ===
>
> So,  at least I may try to cut this video at various intervals and see if
> cutting breaks on specifically open-gop h264 stream.
>
> But as  it was said in forum post above - ffprobe  a bit slow, few minutes
> for whole video, eating one cpu core completely.
>
> Is there faster way to get this info ?
>



Additionally, I tried to add  another variable  key_frame to see difference
between IDR frames (I type , key_frame=1) and just I type frames:

ffprobe -v 32 -stats -y -hide_banner -i
~/Sea_of_life_plus_Mikura_dolphins_test.mp4 -select_streams v -print_format
csv -of csv  -show_entries
"frame=pkt_pts_time,pict_type,key_frame,coded_picture_number" >>
"Sea_of_life-n1-v1.csv"

but resulting csv file grouped them like

 frame,1,8.341667,I,249

like key_frame come before pkt_pts_time.

May be this is bug due to ffprobe being from v. 4.4.4 and not latest. Not
sure. But interesting.

I also see few picture types in libavutil/avutil.h

enum AVPictureType {
    AV_PICTURE_TYPE_NONE = 0, ///< Undefined
    AV_PICTURE_TYPE_I,     ///< Intra
    AV_PICTURE_TYPE_P,     ///< Predicted
    AV_PICTURE_TYPE_B,     ///< Bi-dir predicted
    AV_PICTURE_TYPE_S,     ///< S(GMC)-VOP MPEG-4

AV_PICTURE_TYPE_SI,    ///< Switching Intra
 AV_PICTURE_TYPE_SP,    ///< Switching Predicted
  AV_PICTURE_TYPE_BI,    ///< BI type
};


Is this list complete when it comes to codecs like HEVC ?


More information about the ffmpeg-user mailing list