• Hans Verkuil's avatar
    [media] v4l2-ctrls: fix and improve volatile control handling · ddac5c10
    Hans Verkuil authored
    If you have a cluster of controls that is a mix of volatile and non-volatile
    controls, then requesting the value of the volatile control would fail if the
    master control of that cluster was non-volatile. The code assumed that the
    volatile state of the master control was the same for all other controls in
    the cluster.
    
    This is now fixed.
    
    In addition, it was clear from bugs in some drivers that it was confusing that
    the ctrl->cur union had to be used in g_volatile_ctrl. Several drivers used the
    'new' values instead. The framework was changed so that drivers now set the new
    value instead of the current value.
    
    This has an additional benefit as well: the volatile values are now only stored
    in the 'new' value, leaving the current value alone. This is useful for
    autofoo/foo control clusters where you want to have a 'foo' control act like a
    volatile control if 'autofoo' is on, but as a normal control when it is off.
    
    Since with this change the cur value is no longer overwritten when g_volatile_ctrl
    is called, you can use it to remember the original 'foo' value. For example:
    
    autofoo = 0, foo = 10 and foo is non-volatile.
    
    Now autofoo is set to 1 and foo is marked volatile. Retrieving the foo value
    will get the volatile value. Set autofoo back to 0, which marks foo as non-
    volatile again, and retrieving foo will get the old current value of 10.
    Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    ddac5c10
fmdrv_v4l2.c 14.2 KB