Skip to content

Commit

Permalink
V4L/DVB: sh_mobile_ceu_camera.c: update documentation to reflect the …
Browse files Browse the repository at this point in the history
…new cropping

Signed-off-by: Guennadi Liakhovetski <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
lyakh authored and Mauro Carvalho Chehab committed May 19, 2010
1 parent ab56d5e commit f7fc97a
Showing 1 changed file with 31 additions and 49 deletions.
80 changes: 31 additions & 49 deletions Documentation/video4linux/sh_mobile_ceu_camera.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,30 @@ Generic scaling / cropping scheme
-2-- -\
| --\
| --\
+-5-- -\ -- -3--
| ---\
| --- -4-- -\
| -\
| - -6--
+-5-- . -- -3-- -\
| `... -\
| `... -4-- . - -7..
| `.
| `. .6--
|
| - -6'-
| -/
| --- -4'- -/
| ---/
+-5'- -/
| -- -3'-
| . .6'-
|
| ... -4'-
| ...´ - -7'.
+-5'- -/
| -- -3'- -/
| --/
| --/
-2'- -/
|
|
-1'-

Produced by user requests:
In the above chart minuses and slashes represent "real" data amounts, points and
accents represent "useful" data, basically, CEU scaled amd cropped output,
mapped back onto the client's source plane.

Such a configuration can be produced by user requests:

S_CROP(left / top = (5) - (1), width / height = (5') - (5))
S_FMT(width / height = (6') - (6))
Expand Down Expand Up @@ -106,52 +110,30 @@ window:
S_CROP
------

If old scale applied to new crop is invalid produce nearest new scale possible

1. Calculate current combined scales.

scale_comb = (((4') - (4)) / ((6') - (6))) * (((2') - (2)) / ((3') - (3)))

2. Apply iterative sensor S_CROP for new input window.

3. If old combined scales applied to new crop produce an impossible user window,
adjust scales to produce nearest possible window.

width_u_out = ((5') - (5)) / scale_comb
The API at http://v4l2spec.bytesex.org/spec/x1904.htm says:

if (width_u_out > max)
scale_comb = ((5') - (5)) / max;
else if (width_u_out < min)
scale_comb = ((5') - (5)) / min;
"...specification does not define an origin or units. However by convention
drivers should horizontally count unscaled samples relative to 0H."

4. Issue G_CROP to retrieve actual input window.
We choose to follow the advise and interpret cropping units as client input
pixels.

5. Using actual input window and calculated combined scales calculate sensor
target output window.

width_s_out = ((3') - (3)) = ((2') - (2)) / scale_comb

6. Apply iterative S_FMT for new sensor target output window.

7. Issue G_FMT to retrieve the actual sensor output window.

8. Calculate sensor scales.

scale_s = ((3') - (3)) / ((2') - (2))
Cropping is performed in the following 6 steps:

9. Calculate sensor output subwindow to be cropped on CEU by applying sensor
scales to the requested window.
1. Request exactly user rectangle from the sensor.

width_ceu = ((5') - (5)) / scale_s
2. If smaller - iterate until a larger one is obtained. Result: sensor cropped
to 2 : 2', target crop 5 : 5', current output format 6' - 6.

10. Use CEU cropping for above calculated window.
3. In the previous step the sensor has tried to preserve its output frame as
good as possible, but it could have changed. Retrieve it again.

11. Calculate CEU scales from sensor scales from results of (10) and user window
from (3)
4. Sensor scaled to 3 : 3'. Sensor's scale is (2' - 2) / (3' - 3). Calculate
intermediate window: 4' - 4 = (5' - 5) * (3' - 3) / (2' - 2)

scale_ceu = calc_scale(((5') - (5)), &width_u_out)
5. Calculate and apply host scale = (6' - 6) / (4' - 4)

12. Apply CEU scales.
6. Calculate and apply host crop: 6 - 7 = (5 - 2) * (6' - 6) / (5' - 5)

--
Author: Guennadi Liakhovetski <[email protected]>

0 comments on commit f7fc97a

Please sign in to comment.