From: Stefano Sabatini <stefasab@gmail.com> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Cc: Stefano Sabatini <stefasab@gmail.com> Subject: [FFmpeg-devel] [PATCH 1/3] ffprobe: factorize side data printing to dedicated function Date: Fri, 1 Sep 2023 15:43:34 +0200 Message-ID: <20230901134336.1455166-1-stefasab@gmail.com> (raw) --- fftools/ffprobe.c | 163 ++++++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 78 deletions(-) diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 4fcfe1164b..547e299312 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -2578,6 +2578,89 @@ static void show_subtitle(WriterContext *w, AVSubtitle *sub, AVStream *stream, fflush(stdout); } +static void print_frame_side_data(WriterContext *w, + AVFrame *frame, + AVStream *stream) +{ + int i; + + writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_LIST); + + for (i = 0; i < frame->nb_side_data; i++) { + AVFrameSideData *sd = frame->side_data[i]; + const char *name; + + writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA); + name = av_frame_side_data_name(sd->type); + print_str("side_data_type", name ? name : "unknown"); + if (sd->type == AV_FRAME_DATA_DISPLAYMATRIX && sd->size >= 9*4) { + double rotation = av_display_rotation_get((int32_t *)sd->data); + if (isnan(rotation)) + rotation = 0; + writer_print_integers(w, "displaymatrix", sd->data, 9, " %11d", 3, 4, 1); + print_int("rotation", rotation); + } else if (sd->type == AV_FRAME_DATA_AFD && sd->size > 0) { + print_int("active_format", *sd->data); + } else if (sd->type == AV_FRAME_DATA_GOP_TIMECODE && sd->size >= 8) { + char tcbuf[AV_TIMECODE_STR_SIZE]; + av_timecode_make_mpeg_tc_string(tcbuf, *(int64_t *)(sd->data)); + print_str("timecode", tcbuf); + } else if (sd->type == AV_FRAME_DATA_S12M_TIMECODE && sd->size == 16) { + uint32_t *tc = (uint32_t*)sd->data; + int m = FFMIN(tc[0],3); + writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST); + for (int j = 1; j <= m ; j++) { + char tcbuf[AV_TIMECODE_STR_SIZE]; + av_timecode_make_smpte_tc_string2(tcbuf, stream->avg_frame_rate, tc[j], 0, 0); + writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE); + print_str("value", tcbuf); + writer_print_section_footer(w); + } + writer_print_section_footer(w); + } else if (sd->type == AV_FRAME_DATA_MASTERING_DISPLAY_METADATA) { + AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data; + + if (metadata->has_primaries) { + print_q("red_x", metadata->display_primaries[0][0], '/'); + print_q("red_y", metadata->display_primaries[0][1], '/'); + print_q("green_x", metadata->display_primaries[1][0], '/'); + print_q("green_y", metadata->display_primaries[1][1], '/'); + print_q("blue_x", metadata->display_primaries[2][0], '/'); + print_q("blue_y", metadata->display_primaries[2][1], '/'); + + print_q("white_point_x", metadata->white_point[0], '/'); + print_q("white_point_y", metadata->white_point[1], '/'); + } + + if (metadata->has_luminance) { + print_q("min_luminance", metadata->min_luminance, '/'); + print_q("max_luminance", metadata->max_luminance, '/'); + } + } else if (sd->type == AV_FRAME_DATA_DYNAMIC_HDR_PLUS) { + AVDynamicHDRPlus *metadata = (AVDynamicHDRPlus *)sd->data; + print_dynamic_hdr10_plus(w, metadata); + } else if (sd->type == AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) { + AVContentLightMetadata *metadata = (AVContentLightMetadata *)sd->data; + print_int("max_content", metadata->MaxCLL); + print_int("max_average", metadata->MaxFALL); + } else if (sd->type == AV_FRAME_DATA_ICC_PROFILE) { + const AVDictionaryEntry *tag = av_dict_get(sd->metadata, "name", NULL, AV_DICT_MATCH_CASE); + if (tag) + print_str(tag->key, tag->value); + print_int("size", sd->size); + } else if (sd->type == AV_FRAME_DATA_DOVI_METADATA) { + print_dovi_metadata(w, (const AVDOVIMetadata *)sd->data); + } else if (sd->type == AV_FRAME_DATA_DYNAMIC_HDR_VIVID) { + AVDynamicHDRVivid *metadata = (AVDynamicHDRVivid *)sd->data; + print_dynamic_hdr_vivid(w, metadata); + } else if (sd->type == AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT) { + print_ambient_viewing_environment(w, (const AVAmbientViewingEnvironment *)sd->data); + } + writer_print_section_footer(w); + } + writer_print_section_footer(w); +} + static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream, AVFormatContext *fmt_ctx) { @@ -2585,7 +2668,6 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream, AVBPrint pbuf; char val_str[128]; const char *s; - int i; av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED); @@ -2669,83 +2751,8 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream, show_tags(w, frame->metadata, SECTION_ID_FRAME_TAGS); if (do_show_log) show_log(w, SECTION_ID_FRAME_LOGS, SECTION_ID_FRAME_LOG, do_show_log); - if (frame->nb_side_data) { - writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_LIST); - for (i = 0; i < frame->nb_side_data; i++) { - AVFrameSideData *sd = frame->side_data[i]; - const char *name; - - writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA); - name = av_frame_side_data_name(sd->type); - print_str("side_data_type", name ? name : "unknown"); - if (sd->type == AV_FRAME_DATA_DISPLAYMATRIX && sd->size >= 9*4) { - double rotation = av_display_rotation_get((int32_t *)sd->data); - if (isnan(rotation)) - rotation = 0; - writer_print_integers(w, "displaymatrix", sd->data, 9, " %11d", 3, 4, 1); - print_int("rotation", rotation); - } else if (sd->type == AV_FRAME_DATA_AFD && sd->size > 0) { - print_int("active_format", *sd->data); - } else if (sd->type == AV_FRAME_DATA_GOP_TIMECODE && sd->size >= 8) { - char tcbuf[AV_TIMECODE_STR_SIZE]; - av_timecode_make_mpeg_tc_string(tcbuf, *(int64_t *)(sd->data)); - print_str("timecode", tcbuf); - } else if (sd->type == AV_FRAME_DATA_S12M_TIMECODE && sd->size == 16) { - uint32_t *tc = (uint32_t*)sd->data; - int m = FFMIN(tc[0],3); - writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST); - for (int j = 1; j <= m ; j++) { - char tcbuf[AV_TIMECODE_STR_SIZE]; - av_timecode_make_smpte_tc_string2(tcbuf, stream->avg_frame_rate, tc[j], 0, 0); - writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE); - print_str("value", tcbuf); - writer_print_section_footer(w); - } - writer_print_section_footer(w); - } else if (sd->type == AV_FRAME_DATA_MASTERING_DISPLAY_METADATA) { - AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data; - - if (metadata->has_primaries) { - print_q("red_x", metadata->display_primaries[0][0], '/'); - print_q("red_y", metadata->display_primaries[0][1], '/'); - print_q("green_x", metadata->display_primaries[1][0], '/'); - print_q("green_y", metadata->display_primaries[1][1], '/'); - print_q("blue_x", metadata->display_primaries[2][0], '/'); - print_q("blue_y", metadata->display_primaries[2][1], '/'); - - print_q("white_point_x", metadata->white_point[0], '/'); - print_q("white_point_y", metadata->white_point[1], '/'); - } - - if (metadata->has_luminance) { - print_q("min_luminance", metadata->min_luminance, '/'); - print_q("max_luminance", metadata->max_luminance, '/'); - } - } else if (sd->type == AV_FRAME_DATA_DYNAMIC_HDR_PLUS) { - AVDynamicHDRPlus *metadata = (AVDynamicHDRPlus *)sd->data; - print_dynamic_hdr10_plus(w, metadata); - } else if (sd->type == AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) { - AVContentLightMetadata *metadata = (AVContentLightMetadata *)sd->data; - print_int("max_content", metadata->MaxCLL); - print_int("max_average", metadata->MaxFALL); - } else if (sd->type == AV_FRAME_DATA_ICC_PROFILE) { - const AVDictionaryEntry *tag = av_dict_get(sd->metadata, "name", NULL, AV_DICT_MATCH_CASE); - if (tag) - print_str(tag->key, tag->value); - print_int("size", sd->size); - } else if (sd->type == AV_FRAME_DATA_DOVI_METADATA) { - print_dovi_metadata(w, (const AVDOVIMetadata *)sd->data); - } else if (sd->type == AV_FRAME_DATA_DYNAMIC_HDR_VIVID) { - AVDynamicHDRVivid *metadata = (AVDynamicHDRVivid *)sd->data; - print_dynamic_hdr_vivid(w, metadata); - } else if (sd->type == AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT) { - print_ambient_viewing_environment( - w, (const AVAmbientViewingEnvironment *)sd->data); - } - writer_print_section_footer(w); - } - writer_print_section_footer(w); - } + if (frame->nb_side_data) + print_frame_side_data(w, frame, stream); writer_print_section_footer(w); -- 2.34.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next reply other threads:[~2023-09-01 13:43 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-09-01 13:43 Stefano Sabatini [this message] 2023-09-01 13:43 ` [FFmpeg-devel] [PATCH 2/3] ffprobe: correct section name for side data piece Stefano Sabatini 2023-09-01 13:43 ` [FFmpeg-devel] [PATCH 3/3] ffprobe: introduce section type, use for the compact output Stefano Sabatini 2023-09-05 23:15 ` Stefano Sabatini 2023-10-05 23:26 ` Stefano Sabatini 2023-09-02 8:33 ` [FFmpeg-devel] [PATCH 1/3] ffprobe: factorize side data printing to dedicated function Andreas Rheinhardt 2023-09-02 15:33 ` Stefano Sabatini
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230901134336.1455166-1-stefasab@gmail.com \ --to=stefasab@gmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git