Printing venc params in ffprobe makes it easier for program to parse the data via ffprobe json output --- fftools/ffprobe.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c index 5515e1b31b..b20bddc897 100644 --- a/fftools/ffprobe.c +++ b/fftools/ffprobe.c @@ -47,6 +47,7 @@ #include "libavutil/parseutils.h" #include "libavutil/timecode.h" #include "libavutil/timestamp.h" +#include "libavutil/video_enc_params.h" #include "libavdevice/avdevice.h" #include "libswscale/swscale.h" #include "libswresample/swresample.h" @@ -166,6 +167,8 @@ typedef enum { SECTION_ID_FRAME_TAGS, SECTION_ID_FRAME_SIDE_DATA_LIST, SECTION_ID_FRAME_SIDE_DATA, + SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST, + SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, SECTION_ID_FRAME_SIDE_DATA_TIMECODE, SECTION_ID_FRAME_LOG, @@ -213,6 +216,8 @@ static struct section sections[] = { [SECTION_ID_FRAME_TAGS] = { SECTION_ID_FRAME_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "frame_tags" }, [SECTION_ID_FRAME_SIDE_DATA_LIST] ={ SECTION_ID_FRAME_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA, -1 }, .element_name = "side_data", .unique_name = "frame_side_data_list" }, [SECTION_ID_FRAME_SIDE_DATA] = { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, -1 } }, + [SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST] ={ SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST, "block_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA, -1 }, .element_name = "block_data", .unique_name = "frame_block_data_list"}, + [SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA] = { SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA, "block_data", 0, { -1 }, .show_all_entries = 1 }, [SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST] = { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, "timecodes", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE, -1 } }, [SECTION_ID_FRAME_SIDE_DATA_TIMECODE] = { SECTION_ID_FRAME_SIDE_DATA_TIMECODE, "timecode", 0, { -1 } }, [SECTION_ID_FRAME_LOGS] = { SECTION_ID_FRAME_LOGS, "logs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_LOG, -1 } }, @@ -2259,6 +2264,34 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream, if (tag) print_str(tag->key, tag->value); print_int("size", sd->size); + } else if (sd->type == AV_FRAME_DATA_VIDEO_ENC_PARAMS) { + AVVideoEncParams *par = (AVVideoEncParams *) sd->data; + print_int("type", par->type); + print_int("qp", par->qp); + for (int plane = 0; plane < FF_ARRAY_ELEMS(par->delta_qp); plane++) + for (int acdc = 0; acdc < FF_ARRAY_ELEMS(par->delta_qp[plane]); acdc++) { + int delta_qp = par->delta_qp[plane][acdc]; + if (delta_qp) { + char buf[16]; + snprintf(buf, sizeof(buf), "delta_qp[%d][%d]", plane, acdc); + print_int(buf, delta_qp); + } + } + if (par->nb_blocks) { + print_int("nb_blocks", par->nb_blocks); + writer_print_section_header(w, SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA_LIST); + for (int i = 0; i < par->nb_blocks; i++) { + AVVideoBlockParams *b = av_video_enc_params_block(par, i); + writer_print_section_header(w, SECTION_ID_FRAME_VENC_PARAMS_BLOCK_DATA); + print_int("src_x", b->src_x); + print_int("src_y", b->src_y); + print_int("width", b->w); + print_int("height", b->h); + print_int("delta_qp", b->delta_qp); + writer_print_section_footer(w); + } + writer_print_section_footer(w); + } } writer_print_section_footer(w); } -- 2.28.0.220.ged08abb693-goog _______________________________________________ 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".