Em 28-02-2012 08:18, Hans Verkuil escreveu: > On Tuesday, February 28, 2012 12:03:23 Mauro Carvalho Chehab wrote: >> Em 03-02-2012 08:06, Hans Verkuil escreveu: >>> From: Hans Verkuil <hans.verkuil@xxxxxxxxx> >>> >>> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> >>> --- >>> drivers/media/video/v4l2-common.c | 102 ++++++++++++++++++++++++++++++------- >>> include/media/v4l2-common.h | 15 +++++ >>> 2 files changed, 99 insertions(+), 18 deletions(-) >>> >>> diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c >>> index 5c6100f..f133961 100644 >>> --- a/drivers/media/video/v4l2-common.c >>> +++ b/drivers/media/video/v4l2-common.c >>> @@ -567,24 +567,24 @@ int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info) >>> const char *name; >>> } dv_presets[] = { >>> { 0, 0, "Invalid" }, /* V4L2_DV_INVALID */ >>> - { 720, 480, "480p@59.94" }, /* V4L2_DV_480P59_94 */ >>> - { 720, 576, "576p@50" }, /* V4L2_DV_576P50 */ >>> - { 1280, 720, "720p@24" }, /* V4L2_DV_720P24 */ >>> - { 1280, 720, "720p@25" }, /* V4L2_DV_720P25 */ >>> - { 1280, 720, "720p@30" }, /* V4L2_DV_720P30 */ >>> - { 1280, 720, "720p@50" }, /* V4L2_DV_720P50 */ >>> - { 1280, 720, "720p@59.94" }, /* V4L2_DV_720P59_94 */ >>> - { 1280, 720, "720p@60" }, /* V4L2_DV_720P60 */ >>> - { 1920, 1080, "1080i@29.97" }, /* V4L2_DV_1080I29_97 */ >>> - { 1920, 1080, "1080i@30" }, /* V4L2_DV_1080I30 */ >>> - { 1920, 1080, "1080i@25" }, /* V4L2_DV_1080I25 */ >>> - { 1920, 1080, "1080i@50" }, /* V4L2_DV_1080I50 */ >>> - { 1920, 1080, "1080i@60" }, /* V4L2_DV_1080I60 */ >>> - { 1920, 1080, "1080p@24" }, /* V4L2_DV_1080P24 */ >>> - { 1920, 1080, "1080p@25" }, /* V4L2_DV_1080P25 */ >>> - { 1920, 1080, "1080p@30" }, /* V4L2_DV_1080P30 */ >>> - { 1920, 1080, "1080p@50" }, /* V4L2_DV_1080P50 */ >>> - { 1920, 1080, "1080p@60" }, /* V4L2_DV_1080P60 */ >>> + { 720, 480, "720x480p59.94" }, /* V4L2_DV_480P59_94 */ >>> + { 720, 576, "720x576p50" }, /* V4L2_DV_576P50 */ >>> + { 1280, 720, "1280x720p24" }, /* V4L2_DV_720P24 */ >>> + { 1280, 720, "1280x720p25" }, /* V4L2_DV_720P25 */ >>> + { 1280, 720, "1280x720p30" }, /* V4L2_DV_720P30 */ >>> + { 1280, 720, "1280x720p50" }, /* V4L2_DV_720P50 */ >>> + { 1280, 720, "1280x720p59.94" },/* V4L2_DV_720P59_94 */ >>> + { 1280, 720, "1280x720p60" }, /* V4L2_DV_720P60 */ >> >>> + { 0, 0, "Invalid" }, /* V4L2_DV_1080I29_97 */ >>> + { 0, 0, "Invalid" }, /* V4L2_DV_1080I30 */ >>> + { 0, 0, "Invalid" }, /* V4L2_DV_1080I25 */ >> >> Huh? That seems to be causing a regression. > > I'm not quite certain how to handle this. The problem is that these three > formats literally do not exist. I'm entirely to blame for this and I've no > idea how I ended up adding these formats. > > Changing this table was my, possibly misguided, attempt to at least let > the application know that these formats are bogus. > > No drivers currently support these formats (for obvious reasons). > > An alternative is to make a feature-removal entry, saying that these three > formats are removed in 3.5, and until then leave this table as is. > > What do you think? Better to add it at features to be removed. After cleaning them, we might re-use those "enum" values with non-bogus values on some future. > > Regards, > > Hans > >> >>> + { 1920, 1080, "1920x1080i50" }, /* V4L2_DV_1080I50 */ >>> + { 1920, 1080, "1920x1080i60" }, /* V4L2_DV_1080I60 */ >>> + { 1920, 1080, "1920x1080p24" }, /* V4L2_DV_1080P24 */ >>> + { 1920, 1080, "1920x1080p25" }, /* V4L2_DV_1080P25 */ >>> + { 1920, 1080, "1920x1080p30" }, /* V4L2_DV_1080P30 */ >>> + { 1920, 1080, "1920x1080p50" }, /* V4L2_DV_1080P50 */ >>> + { 1920, 1080, "1920x1080p60" }, /* V4L2_DV_1080P60 */ >>> }; >>> >>> if (info == NULL || preset >= ARRAY_SIZE(dv_presets)) >>> @@ -598,6 +598,72 @@ int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info) >>> } >>> EXPORT_SYMBOL_GPL(v4l_fill_dv_preset_info); >>> >>> +bool v4l_match_dv_timings(const struct v4l2_dv_timings *t1, >>> + const struct v4l2_dv_timings *t2) >>> +{ >>> + if (t1->type != t2->type || t1->type != V4L2_DV_BT_656_1120) >>> + return false; >>> + return !memcmp(&t1->bt, &t2->bt, &t1->bt.standards - &t1->bt.width); >>> +} >>> +EXPORT_SYMBOL_GPL(v4l_match_dv_timings); >>> + >>> +bool v4l_match_dv_timings_fuzzy(const struct v4l2_dv_timings *t1, >>> + const struct v4l2_dv_timings *t2, >>> + u32 clock_resolution, u32 flags) >>> +{ >>> + const struct v4l2_bt_timings *bt1, *bt2; >>> + unsigned v_blank1, v_blank2; >>> + u32 clock_diff; >>> + >>> + if (t1->type != t2->type || t1->type != V4L2_DV_BT_656_1120) >>> + return false; >>> + bt1 = &t1->bt; >>> + bt2 = &t2->bt; >>> + if (bt1->interlaced != bt2->interlaced) >>> + return false; >>> + v_blank1 = bt1->vfrontporch + bt1->vsync + bt1->vbackporch + >>> + bt1->il_vfrontporch + bt1->il_vsync + bt1->il_vbackporch; >>> + v_blank2 = bt2->vfrontporch + bt2->vsync + bt2->vbackporch + >>> + bt2->il_vfrontporch + bt2->il_vsync + bt2->il_vbackporch; >>> + if (bt1->height != bt2->height) >>> + return false; >>> + if ((flags & V4L_MATCH_BT_HAVE_ACTIVE_HEIGHT) && >>> + v_blank1 != v_blank2) >>> + return false; >>> + if ((flags & V4L_MATCH_BT_HAVE_V_POL) && >>> + (bt1->polarities & V4L2_DV_VSYNC_POS_POL) != >>> + (bt2->polarities & V4L2_DV_VSYNC_POS_POL)) >>> + return false; >>> + if ((flags & V4L_MATCH_BT_HAVE_H_POL) && >>> + (bt1->polarities & V4L2_DV_HSYNC_POS_POL) != >>> + (bt2->polarities & V4L2_DV_HSYNC_POS_POL)) >>> + return false; >>> + if ((flags & V4L_MATCH_BT_HAVE_VSYNC) && >>> + bt1->vsync != bt2->vsync) >>> + return false; >>> + if ((flags & V4L_MATCH_BT_HAVE_HSYNC) && >>> + bt1->hsync != bt2->hsync) >>> + return false; >>> + if (flags & V4L_MATCH_BT_HAVE_WIDTH) { >>> + unsigned h_blank1 = bt1->hfrontporch + bt1->hsync + >>> + bt1->hbackporch; >>> + unsigned h_blank2 = bt2->hfrontporch + bt2->hsync + >>> + bt2->hbackporch; >>> + >>> + if (bt1->width != bt2->width) >>> + return false; >>> + if ((flags & V4L_MATCH_BT_HAVE_ACTIVE_WIDTH) && >>> + h_blank1 != h_blank2) >>> + return false; >>> + } >>> + if (bt1->pixelclock > bt2->pixelclock) >>> + clock_diff = bt1->pixelclock - bt2->pixelclock; >>> + else >>> + clock_diff = bt2->pixelclock - bt1->pixelclock; >>> + return clock_diff < clock_resolution; >>> +} >>> +EXPORT_SYMBOL_GPL(v4l_match_dv_timings_fuzzy); >>> + >>> const struct v4l2_frmsize_discrete *v4l2_find_nearest_format( >>> const struct v4l2_discrete_probe *probe, >>> s32 width, s32 height) >>> diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h >>> index a298ec4..4469696 100644 >>> --- a/include/media/v4l2-common.h >>> +++ b/include/media/v4l2-common.h >>> @@ -202,6 +202,21 @@ void v4l_bound_align_image(unsigned int *w, unsigned int wmin, >>> unsigned int hmax, unsigned int halign, >>> unsigned int salign); >>> int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info); >>> +bool v4l_match_dv_timings(const struct v4l2_dv_timings *t1, >>> + const struct v4l2_dv_timings *t2); >>> + >>> +#define V4L_MATCH_BT_HAVE_WIDTH (1 << 0) >>> +#define V4L_MATCH_BT_HAVE_ACTIVE_HEIGHT (1 << 1) >>> +#define V4L_MATCH_BT_HAVE_ACTIVE_WIDTH (1 << 2) >>> +#define V4L_MATCH_BT_HAVE_V_POL (1 << 3) >>> +#define V4L_MATCH_BT_HAVE_H_POL (1 << 4) >>> +#define V4L_MATCH_BT_HAVE_VSYNC (1 << 5) >>> +#define V4L_MATCH_BT_HAVE_HSYNC (1 << 6) >>> + >>> +bool v4l_match_dv_timings_fuzzy(const struct v4l2_dv_timings *t1, >>> + const struct v4l2_dv_timings *t2, >>> + u32 clock_resolution, >>> + u32 flags); >>> >>> struct v4l2_discrete_probe { >>> const struct v4l2_frmsize_discrete *sizes; >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-media" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html