Source: https://guthlabs.ai/docs/instruments/frame-rate-conversion-pulldown-calculator/

instrument / verified-clean

# Frame Rate Conversion / Pulldown Calculator

The current ledger marks this instrument verified clean within the source-bound verification corpus.

Status: **VERIFIED_CLEAN**Lifecycle: **verified-clean**

## Inspectable records

[01**Overview**Purpose and lifecycle](<https://guthlabs.ai/docs/instruments/frame-rate-conversion-pulldown-calculator/>)[02**Mechanism**Method and assumptions](<https://guthlabs.ai/docs/instruments/frame-rate-conversion-pulldown-calculator/mechanism/>)[03**Implementation**Binding and validation](<https://guthlabs.ai/docs/instruments/frame-rate-conversion-pulldown-calculator/implementation/>)[04**Qualification**Evidence and errata](<https://guthlabs.ai/docs/instruments/frame-rate-conversion-pulldown-calculator/qualification/>)

## Ledger state

The current ledger marks this instrument verified clean within the source-bound verification corpus.

**Area**: Audio, Music, Photography & Color

**Tranche**: tranche-4

**Evidence ID**: t4-285

**Ledger rows**: 1

No ledger note is attached.

## Review findings

The arithmetic formula is sound under explicit seconds and frames-per-second units, but the instrument claim is incomplete for frame-count inputs and ambiguous for pulldown. The honest label must distinguish exact 23.976-to-29.97 telecine from nominal 24-to-29.97 conversion and must disclose any fractional-frame or rounding behavior.

### Formula and scope findings

- newFrames=duration*newFps is correct only when duration is explicitly in seconds and is preserved during conversion.

- For a source frame-count input, the required formula is convertedFrames=(sourceFrameCount/sourceFps)*targetFps; this is not stated.

- A 3:2 pulldown cadence is exact for 23.976 fps to 29.97 fps when those rates are interpreted as 24000/1001 and 30000/1001. It is not an exact duration-preserving conversion from 24 fps to 29.97 fps because 29.97/24 is not exactly 5/4.

- The cadence phase and ordering are unspecified: 2:3 and 3:2 can describe the same cadence with different starting phases. The actual field pattern should be specified, such as 2:3:2:3 fields per four source frames.

- The specification does not state how fractional converted frame counts are rounded, accumulated, or represented when the result is not an integer.

### Unit assumptions

- Duration is measured in seconds.

- Frame rates are measured in frames per second.

- For standard broadcast rates, 23.976 means exactly 24000/1001 fps and 29.97 means exactly 30000/1001 fps, rather than approximate decimal rates.

- A duration-preserving frame-rate conversion may produce a fractional nominal frame count; an encoded output must define an integer-frame or timebase policy.

- Pulldown cadence is a field-display pattern, so the field order and starting phase must be defined.

## Boundary hardening

**BREAK_CLAIMED** · SELF_FLAGGED

The specification exposes two failure modes: a zero source frame rate causes an undefined duration, and the 24-to-29.97 pulldown branch produces a nominal 30 cadence frames for one second of 24-fps material while direct arithmetic produces 29.97. The duration field also has an unresolved seconds-versus-frames convention ambiguity.

## Errata and corrections

No applied erratum is attached to this unique-name record.

## Inspectable example

4 review vectors are recorded. One source-bound sample is shown below.

````
{
  "inputs": {
    "sourceFps": 24,
    "targetFps": 30,
    "durationSeconds": 10
  },
  "expected_outputs": {
    "convertedDurationSeconds": 10,
    "newFrames": 300
  },
  "working": "newFrames = duration × targetFps = 10 s × 30 frames/s = 300 frames. Duration remains 10 s because the conversion is duration-preserving."
}
````

## Related workflows

[Video Pipeline Kitrates](<https://guthlabs.ai/docs/instrument-workflows/video-pipeline/>)

## Sources and evidence

These pointers bind the page to evidence. They do not grant authority or collapse verification into deployment.

- `VERIFIED_LEDGER.json · VERIFIED_CLEAN`

- `evidence-tranche4/tranche4-results.json`

- `BOUNDARY_HAZARD_CATALOG.json`
