[FFmpeg-devel] [PATCH 2/2] ffprobe: show seekability details in format section

Gyan Doshi ffmpeg at gyani.pro
Mon Apr 14 07:39:35 EEST 2025



On 2025-04-13 09:48 pm, softworkz . wrote:
>
>> -----Original Message-----
>> From: ffmpeg-devel<ffmpeg-devel-bounces at ffmpeg.org>  On Behalf Of Gyan
>> Doshi
>> Sent: Sonntag, 13. April 2025 13:16
>> To:ffmpeg-devel at ffmpeg.org
>> Subject: [FFmpeg-devel] [PATCH 2/2] ffprobe: show seekability details in
>> format section
>>
>> ---
>>   fftools/ffprobe.c                    | 49 +++++++++++++++++++++++++++-
>>   tests/ref/fate/cavs-demux            |  2 +-
>>   tests/ref/fate/ffprobe_compact       |  2 +-
>>   tests/ref/fate/ffprobe_csv           |  2 +-
>>   tests/ref/fate/ffprobe_default       |  1 +
>>   tests/ref/fate/ffprobe_flat          |  1 +
>>   tests/ref/fate/ffprobe_ini           |  1 +
>>   tests/ref/fate/ffprobe_json          |  1 +
>>   tests/ref/fate/ffprobe_xml           |  2 +-
>>   tests/ref/fate/ffprobe_xsd           |  2 +-
>>   tests/ref/fate/flv-demux             |  2 +-
>>   tests/ref/fate/gapless-mp3-side-data |  2 +-
>>   tests/ref/fate/oggopus-demux         |  2 +-
>>   tests/ref/fate/ts-demux              |  2 +-
>>   tests/ref/fate/ts-opus-demux         |  2 +-
>>   tests/ref/fate/ts-small-demux        |  2 +-
>>   tests/ref/fate/ts-timed-id3-demux    |  2 +-
>>   17 files changed, 64 insertions(+), 13 deletions(-)
>>
>> diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
>> index e0a7322523..8b09afb8c1 100644
>> --- a/fftools/ffprobe.c
>> +++ b/fftools/ffprobe.c
>> @@ -2260,7 +2260,7 @@ static int show_format(AVTextFormatContext *tfc,
>> InputFile *ifile)
>>   {
>>       AVFormatContext *fmt_ctx = ifile->fmt_ctx;
>>       int64_t size = fmt_ctx->pb ? avio_size(fmt_ctx->pb) : -1;
>> -    int ret = 0;
>> +    int seekable, ret = 0;
>>
>>       avtext_print_section_header(tfc, NULL, SECTION_ID_FORMAT);
>>       print_str_validate("filename", fmt_ctx->url);
>> @@ -2279,6 +2279,53 @@ static int show_format(AVTextFormatContext *tfc,
>> InputFile *ifile)
>>       if (fmt_ctx->bit_rate > 0) print_val    ("bit_rate", fmt_ctx-
>>> bit_rate, unit_bit_per_second_str);
>>       else                       print_str_opt("bit_rate", "N/A");
>>       print_int("probe_score", fmt_ctx->probe_score);
>> +
>> +    seekable = avformat_query_seekable(fmt_ctx);
>> +    if (seekable > 0) {
>> +        int gen = 1, ante = 0;
>> +        AVBPrint seek_str;
>> +        av_bprint_init(&seek_str, 0, AV_BPRINT_SIZE_AUTOMATIC);
>> +
>> +        av_bprintf(&seek_str, "yes, by");
>> +        if (seekable & AVSEEKABLE_TIME) {
>> +            av_bprintf(&seek_str, " time");
>> +            if (seekable & AVSEEKABLE_PTS)
>> +                av_bprintf(&seek_str, "(pts)");
>> +            else
>> +                av_bprintf(&seek_str, "(dts)");
>> +            ante = 1;
>> +        }
>> +        if (seekable & AVSEEKABLE_BYTE) {
>> +            av_bprintf(&seek_str, "%cbyte-offset", ante ? ',':' ');
>> +            ante = 1;
>> +        }
>> +        if (seekable & AVSEEKABLE_FRAME) {
>> +            av_bprintf(&seek_str, "%cframe-index", ante ? ',':' ');
>> +        }
>> +
>> +        ante = 0;
>> +        av_bprintf(&seek_str, " via");
>> +        if (seekable & AVSEEKABLE_DEMUXER) {
>> +            av_bprintf(&seek_str, " demuxer");
>> +            gen = 0;
>> +            ante = 1;
>> +        }
>> +        if (seekable & AVSEEKABLE_PKTSCAN) {
>> +            av_bprintf(&seek_str, "%cpacket-scan", ante ? ',':' ');
>> +            gen = 0;
>> +            ante = 0;
>> +        }
>> +        if (gen)
>> +            av_bprintf(&seek_str, " generic seek");
>> +
>> +        if (seekable & AVSEEKABLE_FWDONLY)
>> +            av_bprintf(&seek_str, " (forward only)");
>> +
>> +        print_str("seekable",      seek_str.str);
>> +    }
>> +    else
>> +        print_str("seekable",      "no");
>> +
>>       if (do_show_format_tags)
>>           ret = show_tags(tfc, fmt_ctx->metadata,
>> SECTION_ID_FORMAT_TAGS);
>
> Hi Gyan,
>
> the problem that I see here is that it's not machine-readable and would require non-trivial parsing to translate back to the actual information behind it.
> I think that either a separate sub-section or at least three separate values would be better.

I can add a delimiter like |

e.g.

yes|time(pts),frame-index|demuxer,packet-scan|fast

All of the phrases for an attribute are unique, and for that, they just 
need to grep, not parse the string.
Most CLI users will only care about two things: yes/no and forward-only.

> Another note: When you skim through the ffprobe code, you can see that ffprobe rarely does its own "numbers-to-string" translations (only for cases of absence, like 'none', 'unknown', etc.). Normally, those translations are included in the libs where they are defined.

The information is stored as bitflags in an int. How would the lib do it?

> Oh, and I believe you also need to add new output fields to the xml schema file (ffprobe.xsd).

Will do.

Regards,
Gyan


>
> Still like it! 😊
>
> Thanks,
> sw
>
>
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org  with subject "unsubscribe".


More information about the ffmpeg-devel mailing list