Commit d3f756ad authored by Nicolas Dufresne's avatar Nicolas Dufresne Committed by Mauro Carvalho Chehab
Browse files

media: v4l2: Trace calculated p/b0/b1 initial reflist



Add debug print statements to print the content of P & B reference
lists, to verify that the ordering of the generated reference lists is
correct. This is especially important for the field decoding mode,
where sorting is more complex.

Signed-off-by: default avatarNicolas Dufresne <nicolas.dufresne@collabora.com>
Tested-by: default avatarSebastian Fricke <sebastian.fricke@collabora.com>
Reviewed-by: default avatarSebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent e5991e1f
Loading
Loading
Loading
Loading
+100 −0
Original line number Diff line number Diff line
@@ -12,6 +12,12 @@

#include <media/v4l2-h264.h>

/*
 * Size of the tempory buffer allocated when printing reference lists. The
 * output will be truncated if the size is too small.
 */
static const int tmp_str_size = 1024;

/**
 * v4l2_h264_init_reflist_builder() - Initialize a P/B0/B1 reference list
 *				      builder
@@ -241,6 +247,95 @@ static int v4l2_h264_b1_ref_list_cmp(const void *ptra, const void *ptrb,
	return poca < pocb ? -1 : 1;
}

static char ref_type_to_char(u8 ref_type)
{
	switch (ref_type) {
	case V4L2_H264_FRAME_REF:
		return 'f';
	case V4L2_H264_TOP_FIELD_REF:
		return 't';
	case V4L2_H264_BOTTOM_FIELD_REF:
		return 'b';
	}

	return '?';
}

static const char *format_ref_list_p(const struct v4l2_h264_reflist_builder *builder,
				     struct v4l2_h264_reference *reflist,
				     char **out_str)
{
	int n = 0, i;

	*out_str = kmalloc(tmp_str_size, GFP_KERNEL);

	n += snprintf(*out_str + n, tmp_str_size - n, "|");

	for (i = 0; i < builder->num_valid; i++) {
		/* this is pic_num for frame and frame_num (wrapped) for field,
		 * but for frame pic_num is equal to frame_num (wrapped).
		 */
		int frame_num = builder->refs[reflist[i].index].frame_num;
		bool longterm = builder->refs[reflist[i].index].longterm;

		n += scnprintf(*out_str + n, tmp_str_size - n, "%i%c%c|",
			       frame_num, longterm ? 'l' : 's',
			       ref_type_to_char(reflist[i].fields));
	}

	return *out_str;
}

static void print_ref_list_p(const struct v4l2_h264_reflist_builder *builder,
			     struct v4l2_h264_reference *reflist)
{
	char *buf = NULL;

	pr_debug("ref_pic_list_p (cur_poc %u%c) %s\n",
		 builder->cur_pic_order_count,
		 ref_type_to_char(builder->cur_pic_fields),
		 format_ref_list_p(builder, reflist, &buf));

	kfree(buf);
}

static const char *format_ref_list_b(const struct v4l2_h264_reflist_builder *builder,
				     struct v4l2_h264_reference *reflist,
				     char **out_str)
{
	int n = 0, i;

	*out_str = kmalloc(tmp_str_size, GFP_KERNEL);

	n += snprintf(*out_str + n, tmp_str_size - n, "|");

	for (i = 0; i < builder->num_valid; i++) {
		int frame_num = builder->refs[reflist[i].index].frame_num;
		u32 poc = v4l2_h264_get_poc(builder, reflist + i);
		bool longterm = builder->refs[reflist[i].index].longterm;

		n += scnprintf(*out_str + n, tmp_str_size - n, "%i%c%c|",
			       longterm ? frame_num : poc,
			       longterm ? 'l' : 's',
			       ref_type_to_char(reflist[i].fields));
	}

	return *out_str;
}

static void print_ref_list_b(const struct v4l2_h264_reflist_builder *builder,
			     struct v4l2_h264_reference *reflist, u8 list_num)
{
	char *buf = NULL;

	pr_debug("ref_pic_list_b%u (cur_poc %u%c) %s",
		 list_num, builder->cur_pic_order_count,
		 ref_type_to_char(builder->cur_pic_fields),
		 format_ref_list_b(builder, reflist, &buf));

	kfree(buf);
}

/**
 * v4l2_h264_build_p_ref_list() - Build the P reference list
 *
@@ -261,6 +356,8 @@ v4l2_h264_build_p_ref_list(const struct v4l2_h264_reflist_builder *builder,
	       sizeof(builder->unordered_reflist[0]) * builder->num_valid);
	sort_r(reflist, builder->num_valid, sizeof(*reflist),
	       v4l2_h264_p_ref_list_cmp, NULL, builder);

	print_ref_list_p(builder, reflist);
}
EXPORT_SYMBOL_GPL(v4l2_h264_build_p_ref_list);

@@ -296,6 +393,9 @@ v4l2_h264_build_b_ref_lists(const struct v4l2_h264_reflist_builder *builder,
	if (builder->num_valid > 1 &&
	    !memcmp(b1_reflist, b0_reflist, builder->num_valid))
		swap(b1_reflist[0], b1_reflist[1]);

	print_ref_list_b(builder, b0_reflist, 0);
	print_ref_list_b(builder, b1_reflist, 1);
}
EXPORT_SYMBOL_GPL(v4l2_h264_build_b_ref_lists);