Skip to content

Commit 835d2f6

Browse files
committed
Pinhole_focal_length, not focal_length; adjust readers to set nominal_focal_length. Note that nominal focal length for a zoom lens will be undefined in 1.0.0.
1 parent 0a4372e commit 835d2f6

File tree

18 files changed

+55
-37
lines changed

18 files changed

+55
-37
lines changed

src/main/python/camdkit/arri/reader.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ def to_clip(csv_path: str) -> camdkit.model.Clip:
7979
height=pix_dims.height * pixel_pitch / 1000.0
8080
)
8181

82-
clip.lens_focal_length = tuple(float(m["Lens Focal Length"]) for m in csv_data)
82+
focal_lengths = set([m["Lens Focal Length"] for m in csv_data])
83+
if len(focal_lengths) == 1:
84+
focal_length = float(focal_lengths.pop())
85+
clip.lens_nominal_focal_length = focal_length
8386

8487
clip.lens_focus_distance = tuple(float(m["Lens Focus Distance"]) for m in csv_data)
8588

src/main/python/camdkit/bmd/reader.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,10 @@ def to_clip(metadata_file: typing.IO) -> camdkit.model.Clip:
109109
# sampled metadata
110110

111111
# focal_length
112-
clip.lens_focal_length = tuple(float(m["focal_length"][:-2]) for m in frame_data)
112+
focal_lengths = set([m["focal_length"][:-2] for m in frame_data])
113+
if len(focal_lengths) == 1:
114+
focal_length = float(focal_lengths.pop())
115+
clip.lens_nominal_focal_length = focal_length
113116

114117
# focus_position
115118
clip.lens_focus_distance = tuple(float(m["distance"][:-2]) for m in frame_data)

src/main/python/camdkit/canon/reader.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ def to_clip(static_csv: typing.IO, frames_csv: typing.IO) -> camdkit.model.Clip:
6161
# sampled metadata
6262

6363
# focal_length
64-
clip.lens_focal_length = tuple(Fraction(m["FocalLength"]) for m in frame_data)
64+
focal_lengths = set(Fraction(m["FocalLength"]) for m in frame_data)
65+
if len(focal_lengths) == 1:
66+
focal_length = float(focal_lengths.pop())
67+
clip.lens_nominal_focal_length = focal_length
6568

6669
# focus_position
6770
clip.lens_focus_distance = tuple(_read_float32_as_hex(m["FocusPosition"]) for m in frame_data)

src/main/python/camdkit/examples.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def _unwrap_clip_to_pseudo_frame(wrapped_clip: JsonSchemaValue) -> JsonSchemaVal
2626
("lens", "entrancePupilOffset"),
2727
("lens", "exposureFalloff"),
2828
("lens", "fStop"),
29-
("lens", "focalLength"),
29+
("lens", "pinholeFocalLength"),
3030
("lens", "focusDistance"),
3131
("lens", "projectionOffset"),
3232
("lens", "rawEncoders"),
@@ -160,7 +160,7 @@ def _get_recommended_dynamic_clip():
160160
clip.transforms = ((Transform(translation=v, rotation=r, id="Camera"),),)
161161
# lens
162162
clip.lens_f_number = (4.0,)
163-
clip.lens_focal_length = (24.305,)
163+
clip.lens_pinhole_focal_length = (24.305,)
164164
clip.lens_focus_distance = (10.0,)
165165
clip.lens_entrance_pupil_offset = (0.123,)
166166
clip.lens_encoders = (FizEncoders(focus=0.1, iris=0.2, zoom=0.3),)

src/main/python/camdkit/lens_types.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,12 @@ class Lens(CompatibleBaseModel):
262262
by the diameter of the entrance pupil.
263263
"""
264264

265-
# TODO: file issue to get this renamed to lens_pinhole_focal_length in the clip and pinholeFocalLength in the JSON
266-
focal_length: Annotated[tuple[NonNegativeFloat, ...] | None,
267-
Field(alias="focalLength",
265+
pinhole_focal_length: Annotated[tuple[NonNegativeFloat, ...] | None,
266+
Field(alias="pinholeFocalLength",
268267
json_schema_extra={"units": MILLIMETER,
269-
"clip_property": "lens_focal_length",
268+
"clip_property": "lens_pinhole_focal_length",
270269
"constraints": NON_NEGATIVE_REAL})] = None
271-
"""Focal length of the lens."""
270+
"""Distance between the pinhole and the image plane in the simple CGI pinhole camera model."""
272271

273272
focus_distance: Annotated[tuple[StrictlyPositiveFloat, ...] | None,
274273
Field(alias="focusDistance",

src/main/python/camdkit/mosys/f4.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ def get_tracking_frame(self) -> Clip:
280280
# Assuming a full frame 35mm active sensor 36x24mm
281281
# f = 36/[2*tand(FoV/2)]
282282
fov_radians = fov_h * math.pi / 180.0
283-
frame.lens_focal_length = (36.0 / (2.0 * math.tan(fov_radians/2.0)),)
283+
frame.lens_pinhole_focal_length = (36.0 / (2.0 * math.tan(fov_radians/2.0)),)
284284
frame.lens_encoders = (FizEncoders(focus, iris, zoom),)
285285
frame.lens_distortions = ((Distortion([k1, k2],),),)
286286
frame.lens_projection_offset = (ProjectionOffset(cx, cy),)

src/main/python/camdkit/red/reader.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ def to_clip(meta_3_file: typing.IO, meta_5_file: typing.IO) -> camdkit.model.Cli
7777

7878
clip.shutter_angle = float(clip_metadata["Shutter (deg)"])
7979

80-
clip.lens_focal_length = tuple(int(m["Focal Length"]) for m in csv_data)
80+
focal_lengths = set([float(m["Focal Length"]) for m in csv_data])
81+
if len(focal_lengths) == 1:
82+
focal_length = float(focal_lengths.pop())
83+
clip.lens_nominal_focal_length = focal_length
8184

8285
clip.lens_focus_distance = tuple(int(m["Focus Distance"]) for m in csv_data)
8386

src/main/python/camdkit/venice/reader.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,10 @@ def to_clip(static_file: typing.IO, dynamic_file: typing.IO) -> camdkit.model.Cl
190190

191191
clip.duration = len(csv_data)/clip_fps
192192

193-
clip.lens_focal_length = tuple(float(m["Focal Length (mm)"]) for m in csv_data)
193+
focal_lengths = set([float(m["Focal Length (mm)"]) for m in csv_data])
194+
if len(focal_lengths) == 1:
195+
focal_length = float(focal_lengths.pop())
196+
clip.lens_nominal_focal_length = focal_length
194197

195198
clip.lens_focus_distance = tuple(float(m["Focus Distance (ft)"]) * 12.0 * 25.4 / 1000.0 for m in csv_data)
196199

src/test/python/test_arri_reader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def test_reader(self):
3838

3939
self.assertEqual(clip.capture_frame_rate, 24)
4040

41-
self.assertEqual(clip.lens_focal_length[0], 40)
41+
self.assertEqual(clip.lens_nominal_focal_length, 40)
4242

4343
self.assertEqual(clip.lens_focus_distance[0], 4.812)
4444

src/test/python/test_bmd_reader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def test_reader(self):
3939

4040
self.assertEqual(clip.capture_frame_rate, 48)
4141

42-
self.assertEqual(clip.lens_focal_length[0], 50)
42+
self.assertEqual(clip.lens_nominal_focal_length, 50)
4343

4444
self.assertEqual(clip.lens_focus_distance[0], 991)
4545

0 commit comments

Comments
 (0)