Hi,

On Mon, May 26, 2025 at 2:09 PM Timothée <
timothee.informati...@regaud-chapuy.fr> wrote:

> On 2025-05-23T13:55:57.000+02:00, Michael Niedermayer
> <mich...@niedermayer.cc> wrote:
>
> > On Fri, May 23, 2025 at 11:33:40AM +0200, Timothée wrote:
> >
> >>  On 2025-05-23T02:57:36.000+02:00, Michael Niedermayer
> >>  <mich...@niedermayer.cc> wrote:
> >>
> >>>   On Fri, May 23, 2025 at 02:45:59AM +0200, Michael Niedermayer
> >>>   wrote:
> >>>
> >>>>    Hi Ronald On Thu, May 22, 2025 at 07:59:06AM -0400, Ronald S.
> >>>>    Bultje wrote:
> >>>>
> >>>>>     Hi, On Wed, May 21, 2025 at 9:34 AM Timothée <
> >>>>>     timothee.informati...@regaud-chapuy.fr> wrote:
> >>>>>
> >>>>>>      Hello, I am interested in expanding ffmpeg's capabilities
> >>>>>>      to extract low-level data from video codecs. Specifically,
> >>>>>>      I'd like to implement functionality that would allow
> >>>>>>      exporting frame data, macroblock information, quantization
> >>>>>>      tables, and similar codec-specific elements to binary
> >>>>>>      files for further analysis. After searching through the
> >>>>>>      documentation and existing features, I haven't found
> >>>>>>      similar functionality, though I may have missed something.
> >>>>>>      Has this been implemented before, or are there related
> >>>>>>      features I should examine?
> >>>>>
> >>>>>      Some older codecs implement minor variants for this, e.g.
> >>>>>     grep for AV_FRAME_DATA_MOTION_VECTORS, which attaches a
> >>>>>     frame's motion vectors to the picture data. I believe
> >>>>>     there's an example app and possibly a filter to overlay MVs
> >>>>>     on top of the video frame based on this concept. You could
> >>>>>     extend this to cover other (macro)block info. There used to
> >>>>>     be a variant of this for quant-tables also but I can't find
> >>>>>     it, maybe it was removed.
> >>>>
> >>>>     For motion vectors: ./ffplay -flags2 +export_mvs -i
> >>>>    matrixbench_mpeg2.mpg -vf codecview=mv=pf+bf+bb For macroblock
> >>>>    segmentation and type vissualization + also motion vectors:
> >>>>    ffplay-3.4.13 -debug vis_mb_type matrixbench_mpeg2.mpg -vf
> >>>>    codecview=mv=pf+bf+bb For QP vissualization + also motion
> >>>>    vectors: ffplay-3.4.13 -debug vis_qp matrixbench_mpeg2.mpg -vf
> >>>>    codecview=mv=pf+bf+bb For qp values dumped on the console
> >>>>    ./ffplay -debug qp -i matrixbench_mpeg2.mpg
> >>>
> >>>    And this can easily be extended to other codecs, ATM it should
> >>>   work with all 16x16 MB based codecs like
> >>>   msmpeg4*/wmv*/mpeg1/2/4/h263/h264 mbtype and qp vissualization
> >>>   need codecview to be extended or versions around 3.4 which
> >>>   implemented it differently Implementing vissualization as done
> >>>   currently with sidedata and codecview is simple and efficient.
> >>>   It also would allow exporting the data to json by writing a
> >>>   codec2json filter in place of codecview Also all decoders
> >>>   already have all this data parsed and available so its simpler
> >>>   than trying to do it in a decoder independant way I would thus
> >>>   suggest implementations of this for modern codecs to follow the
> >>>   same path as the existing code. thx
> >>
> >>   Thanks for the helpful pointers! I will work on the codec2json
> >>  filter. Looking at the code, I see where I can access sidedata but
> >>  extracting qb table seems to fail. (in codecview.c l.233:
> >>  ff_qp_table_extract() return 0 and qp_table is empty) (I use
> >>  ./ffmpeg -flags2 +export_mvs -i input.mp4 -vf codecview=qp=1
> >>  output.mp4 -y) Is is qp extraction not implemented yet? Or is it
> >>  because I have h264 video? If it's not implemented, I'm curious
> >>  why there’s already code that appears to handle it.
> >
> >  look at ff_print_debug_info2() theres probably something missing
> > The QP and MB type code was changed from being inside arrays of
> > pictures to sidedata. Something likely was lost/forgotten in the
> > process -debug qp works with h264 so likely teh export into sidedata
> > is not fully implemented
>
> Yes, this is exactly what is happening.
>
> After some research, I have found: `// FIXME qscale / qp ... stuff` in
> libavcodec/h264_slice.c, line 1871
>
> and also in libavfilter/qp_table.h:
> 34 /**
> 35 * Normalize the qscale factor
> 36 * FIXME Add support for other values of enum AVVideoEncParamsType
> 37 * besides AV_VIDEO_ENC_PARAMS_MPEG2.
> 38 */
> 39 static inline int ff_norm_qscale(int qscale, enum
> AVVideoEncParamsType type)
> 40 {
> 41     switch (type) {
> 42        case AV_VIDEO_ENC_PARAMS_MPEG2: return qscale >> 1;
> 43     }
> 44     return qscale;
> 45 }
>
> So if I understand correctly, QP tables are not attached to the frames
> except for MPEG2. This has been left as a FIXME for other codecs.
> Should I extend it to work for H.264, and maybe later for other
> codecs, thus removing the first FIXME and partially fixing the second?
> Or is this too specific and too complicated to maintain if it needs to
> be added for every codec?


I think it's fine to add it one codec at a time.

Ronald
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to