X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_showinfo.c;h=5e1c4dc2e366adead8a9647c80dee08d41817ff8;hb=a859e57424ca0a00d17bdc034c52005c18184961;hp=66a30c7a323c123c9f085399c175670e356a2a1d;hpb=0ea2bda099c6ede92bedaa1c2545c60ff84f7401;p=ffmpeg diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c index 66a30c7a323..5e1c4dc2e36 100644 --- a/libavfilter/vf_showinfo.c +++ b/libavfilter/vf_showinfo.c @@ -29,6 +29,7 @@ #include "libavutil/display.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" +#include "libavutil/hdr_dynamic_metadata.h" #include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/spherical.h" @@ -37,6 +38,7 @@ #include "libavutil/timecode.h" #include "libavutil/mastering_display_metadata.h" #include "libavutil/video_enc_params.h" +#include "libavutil/detection_bbox.h" #include "avfilter.h" #include "internal.h" @@ -152,6 +154,31 @@ static void dump_roi(AVFilterContext *ctx, const AVFrameSideData *sd) } } +static void dump_detection_bbox(AVFilterContext *ctx, const AVFrameSideData *sd) +{ + int nb_bboxes; + const AVDetectionBBoxHeader *header; + const AVDetectionBBox *bbox; + + header = (const AVDetectionBBoxHeader *)sd->data; + nb_bboxes = header->nb_bboxes; + av_log(ctx, AV_LOG_INFO, "detection bounding boxes:\n"); + av_log(ctx, AV_LOG_INFO, "source: %s\n", header->source); + + for (int i = 0; i < nb_bboxes; i++) { + bbox = av_get_detection_bbox(header, i); + av_log(ctx, AV_LOG_INFO, "index: %d,\tregion: (%d, %d) -> (%d, %d), label: %s, confidence: %d/%d.\n", + i, bbox->x, bbox->y, bbox->x + bbox->w, bbox->y + bbox->h, + bbox->detect_label, bbox->detect_confidence.num, bbox->detect_confidence.den); + if (bbox->classify_count > 0) { + for (int j = 0; j < bbox->classify_count; j++) { + av_log(ctx, AV_LOG_INFO, "\t\tclassify: label: %s, confidence: %d/%d.\n", + bbox->classify_labels[j], bbox->classify_confidences[j].num, bbox->classify_confidences[j].den); + } + } + } +} + static void dump_mastering_display(AVFilterContext *ctx, const AVFrameSideData *sd) { const AVMasteringDisplayMetadata *mastering_display; @@ -178,7 +205,107 @@ static void dump_mastering_display(AVFilterContext *ctx, const AVFrameSideData * av_q2d(mastering_display->min_luminance), av_q2d(mastering_display->max_luminance)); } -static void dump_content_light_metadata(AVFilterContext *ctx, const AVFrameSideData *sd) +static void dump_dynamic_hdr_plus(AVFilterContext *ctx, AVFrameSideData *sd) +{ + AVDynamicHDRPlus *hdr_plus; + + av_log(ctx, AV_LOG_INFO, "HDR10+ metadata: "); + if (sd->size < sizeof(*hdr_plus)) { + av_log(ctx, AV_LOG_ERROR, "invalid data\n"); + return; + } + + hdr_plus = (AVDynamicHDRPlus *)sd->data; + av_log(ctx, AV_LOG_INFO, "application version: %d, ", hdr_plus->application_version); + av_log(ctx, AV_LOG_INFO, "num_windows: %d, ", hdr_plus->num_windows); + for (int w = 1; w < hdr_plus->num_windows; w++) { + AVHDRPlusColorTransformParams *params = &hdr_plus->params[w]; + av_log(ctx, AV_LOG_INFO, "window %d { ", w); + av_log(ctx, AV_LOG_INFO, "window_upper_left_corner: (%5.4f,%5.4f),", + av_q2d(params->window_upper_left_corner_x), + av_q2d(params->window_upper_left_corner_y)); + av_log(ctx, AV_LOG_INFO, "window_lower_right_corner: (%5.4f,%5.4f), ", + av_q2d(params->window_lower_right_corner_x), + av_q2d(params->window_lower_right_corner_y)); + av_log(ctx, AV_LOG_INFO, "window_upper_left_corner: (%5.4f, %5.4f), ", + av_q2d(params->window_upper_left_corner_x), + av_q2d(params->window_upper_left_corner_y)); + av_log(ctx, AV_LOG_INFO, "center_of_ellipse_x: (%d,%d), ", + params->center_of_ellipse_x, + params->center_of_ellipse_y); + av_log(ctx, AV_LOG_INFO, "rotation_angle: %d, ", + params->rotation_angle); + av_log(ctx, AV_LOG_INFO, "semimajor_axis_internal_ellipse: %d, ", + params->semimajor_axis_internal_ellipse); + av_log(ctx, AV_LOG_INFO, "semimajor_axis_external_ellipse: %d, ", + params->semimajor_axis_external_ellipse); + av_log(ctx, AV_LOG_INFO, "semiminor_axis_external_ellipse: %d, ", + params->semiminor_axis_external_ellipse); + av_log(ctx, AV_LOG_INFO, "overlap_process_option: %d}, ", + params->overlap_process_option); + } + av_log(ctx, AV_LOG_INFO, "targeted_system_display_maximum_luminance: %9.4f, ", + av_q2d(hdr_plus->targeted_system_display_maximum_luminance)); + if (hdr_plus->targeted_system_display_actual_peak_luminance_flag) { + av_log(ctx, AV_LOG_INFO, "targeted_system_display_actual_peak_luminance: {"); + for (int i = 0; i < hdr_plus->num_rows_targeted_system_display_actual_peak_luminance; i++) { + av_log(ctx, AV_LOG_INFO, "("); + for (int j = 0; j < hdr_plus->num_cols_targeted_system_display_actual_peak_luminance; j++) { + av_log(ctx, AV_LOG_INFO, "%5.4f,", + av_q2d(hdr_plus->targeted_system_display_actual_peak_luminance[i][j])); + } + av_log(ctx, AV_LOG_INFO, ")"); + } + av_log(ctx, AV_LOG_INFO, "}, "); + } + + for (int w = 0; w < hdr_plus->num_windows; w++) { + AVHDRPlusColorTransformParams *params = &hdr_plus->params[w]; + av_log(ctx, AV_LOG_INFO, "window %d {maxscl: {", w); + for (int i = 0; i < 3; i++) { + av_log(ctx, AV_LOG_INFO, "%5.4f,",av_q2d(params->maxscl[i])); + } + av_log(ctx, AV_LOG_INFO, "} average_maxrgb: %5.4f, ", + av_q2d(params->average_maxrgb)); + av_log(ctx, AV_LOG_INFO, "distribution_maxrgb: {"); + for (int i = 0; i < params->num_distribution_maxrgb_percentiles; i++) { + av_log(ctx, AV_LOG_INFO, "(%d,%5.4f)", + params->distribution_maxrgb[i].percentage, + av_q2d(params->distribution_maxrgb[i].percentile)); + } + av_log(ctx, AV_LOG_INFO, "} fraction_bright_pixels: %5.4f, ", + av_q2d(params->fraction_bright_pixels)); + if (params->tone_mapping_flag) { + av_log(ctx, AV_LOG_INFO, "knee_point: (%5.4f,%5.4f), ", av_q2d(params->knee_point_x), av_q2d(params->knee_point_y)); + av_log(ctx, AV_LOG_INFO, "bezier_curve_anchors: {"); + for (int i = 0; i < params->num_bezier_curve_anchors; i++) { + av_log(ctx, AV_LOG_INFO, "%5.4f,", + av_q2d(params->bezier_curve_anchors[i])); + } + av_log(ctx, AV_LOG_INFO, "} "); + } + if (params->color_saturation_mapping_flag) { + av_log(ctx, AV_LOG_INFO, "color_saturation_weight: %5.4f", + av_q2d(params->color_saturation_weight)); + } + av_log(ctx, AV_LOG_INFO, "} "); + } + + if (hdr_plus->mastering_display_actual_peak_luminance_flag) { + av_log(ctx, AV_LOG_INFO, "mastering_display_actual_peak_luminance: {"); + for (int i = 0; i < hdr_plus->num_rows_mastering_display_actual_peak_luminance; i++) { + av_log(ctx, AV_LOG_INFO, "("); + for (int j = 0; j < hdr_plus->num_cols_mastering_display_actual_peak_luminance; j++) { + av_log(ctx, AV_LOG_INFO, " %5.4f,", + av_q2d(hdr_plus->mastering_display_actual_peak_luminance[i][j])); + } + av_log(ctx, AV_LOG_INFO, ")"); + } + av_log(ctx, AV_LOG_INFO, "} "); + } +} + +static void dump_content_light_metadata(AVFilterContext *ctx, AVFrameSideData *sd) { const AVContentLightMetadata *metadata = (const AVContentLightMetadata *)sd->data; @@ -213,7 +340,8 @@ static void dump_sei_unregistered_metadata(AVFilterContext *ctx, const AVFrameSi int i; if (sd->size < uuid_size) { - av_log(ctx, AV_LOG_ERROR, "invalid data(%d < UUID(%d-bytes))\n", sd->size, uuid_size); + av_log(ctx, AV_LOG_ERROR, "invalid data(%"SIZE_SPECIFIER" < " + "UUID(%d-bytes))\n", sd->size, uuid_size); return; } @@ -371,7 +499,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) av_log(ctx, AV_LOG_INFO, "pan/scan"); break; case AV_FRAME_DATA_A53_CC: - av_log(ctx, AV_LOG_INFO, "A/53 closed captions (%d bytes)", sd->size); + av_log(ctx, AV_LOG_INFO, "A/53 closed captions " + "(%"SIZE_SPECIFIER" bytes)", sd->size); break; case AV_FRAME_DATA_SPHERICAL: dump_spherical(ctx, frame, sd); @@ -393,9 +522,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) case AV_FRAME_DATA_REGIONS_OF_INTEREST: dump_roi(ctx, sd); break; + case AV_FRAME_DATA_DETECTION_BBOXES: + dump_detection_bbox(ctx, sd); + break; case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA: dump_mastering_display(ctx, sd); break; + case AV_FRAME_DATA_DYNAMIC_HDR_PLUS: + dump_dynamic_hdr_plus(ctx, sd); + break; case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL: dump_content_light_metadata(ctx, sd); break; @@ -412,8 +547,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) dump_sei_unregistered_metadata(ctx, sd); break; default: - av_log(ctx, AV_LOG_WARNING, "unknown side data type %d (%d bytes)\n", - sd->type, sd->size); + av_log(ctx, AV_LOG_WARNING, "unknown side data type %d " + "(%"SIZE_SPECIFIER" bytes)\n", sd->type, sd->size); break; } @@ -467,7 +602,7 @@ static const AVFilterPad avfilter_vf_showinfo_outputs[] = { { NULL } }; -AVFilter ff_vf_showinfo = { +const AVFilter ff_vf_showinfo = { .name = "showinfo", .description = NULL_IF_CONFIG_SMALL("Show textual information for each video frame."), .inputs = avfilter_vf_showinfo_inputs,