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

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
...@@ -12,6 +12,12 @@ ...@@ -12,6 +12,12 @@
#include <media/v4l2-h264.h> #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 * v4l2_h264_init_reflist_builder() - Initialize a P/B0/B1 reference list
* builder * builder
...@@ -241,6 +247,95 @@ static int v4l2_h264_b1_ref_list_cmp(const void *ptra, const void *ptrb, ...@@ -241,6 +247,95 @@ static int v4l2_h264_b1_ref_list_cmp(const void *ptra, const void *ptrb,
return poca < pocb ? -1 : 1; 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 * 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, ...@@ -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); sizeof(builder->unordered_reflist[0]) * builder->num_valid);
sort_r(reflist, builder->num_valid, sizeof(*reflist), sort_r(reflist, builder->num_valid, sizeof(*reflist),
v4l2_h264_p_ref_list_cmp, NULL, builder); v4l2_h264_p_ref_list_cmp, NULL, builder);
print_ref_list_p(builder, reflist);
} }
EXPORT_SYMBOL_GPL(v4l2_h264_build_p_ref_list); 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, ...@@ -296,6 +393,9 @@ v4l2_h264_build_b_ref_lists(const struct v4l2_h264_reflist_builder *builder,
if (builder->num_valid > 1 && if (builder->num_valid > 1 &&
!memcmp(b1_reflist, b0_reflist, builder->num_valid)) !memcmp(b1_reflist, b0_reflist, builder->num_valid))
swap(b1_reflist[0], b1_reflist[1]); 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); EXPORT_SYMBOL_GPL(v4l2_h264_build_b_ref_lists);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment