Preface - Teasers - Enhanced Terminology - Reference - Encoding of DVD & Bluray Content - About Audio - Recovering The Camera Shots
Basic Primitives - Pulldown Primitives - Advanced Interpolations - Seen In The Wild, Repairing Video


Author's note: I have both the Bluray & the ersatz-PAL DVD versions of 'THE MAN WHO WOULD BE KING' [1975].
 Bluray: UPC 883929150328,  24'fps,  running time: 2:08:52.558167,  cinema running time: 2:08:44.833334  (i.e. (2:08:52.558167)/1.001).
PAL DVD: EAN 9332412010331,  25fps,  running time: 2:03:36.009756,  cinema running time: 2:08:45.010163  (i.e. (2:03:36.009756)/0.96).
Though their running times differ by over 5 minutes, the cinema running times computed from them differ by less than 2/10 second. "How can that be?" the reader may ask. This section addresses that, and more. Tip: Note the occurances of "1.001" & "0.96" in what follows.

What follows are the methods employed when mastering DVD & Bluray content. It is of little use except for basic understanding of video mastering (and of the notation of course).

cinema-at-24'fps is found on Blurays. It is cinema that is tagged for 24'fps via metadata, with audio that has been upsampled by x1.001.
 cinema pictures: (#1_____________________)(#2_________________ .. (#1000__________________)                            ...24pps


ENCODER NOTATION: [24pps]24'fps & 48KHz[x1.001]48KHz
                   \           \   \________________\___ audio has been upsampled by x1.001
                    \___________\___ encode and tag video to force x/1.001 video slowdown

  encoded frames: [#1_____________________][#2_________________ .. [#999___________________][#1000__________________]   ...24'fps
PTSs: forced, PTS-of-N = PTS-of-0 + integer(N x 3753.75) where 'N' is frame index [note 1] -- Combing: none -- Judder: none.

[note 1] The timebase for DVDs & Blurays (i.e. MPEG2-TS) is 90000tps (ticks per second, aka Hz). When divided by 24'fps, the result is 3753.75tpf (ticks per frame, aka deltaPTS), so forced PTSs step by 3753.75. Since 3753.75tpf is fractional, the resulting PTSs are truncated prior to writing metadata. For example, the forced PTSs of frames #2, #3, #4, #5 are 3753, 7507, 11261, 15015. The truncations have mislead some people to believe that commercial DVD & Bluray content can be VFR (variable frame rate).

cinema-at-24'fps-soft (aka soft telecined) is found on ersatz-NTSC DVDs. It is cinema that is tagged for 2-3-2-3 pulldown and 24'fps via metadata, with audio that has been upsampled by x1.001.
 cinema pictures: (#1_____________________)(#2_________________ .. (#1000__________________)                            ...24pps

ENCODER NOTATION: [24pps]24'fps & 48KHz[x1.001]48KHz
                   \           \   \________________\___ audio has been upsampled by x1.001
                    \___________\___ encode and tag video to force x/1.001 video slowdown and to request 2-3-2-3 pulldown when decoded

  encoded frames: [#1_____________________][#2_________________ .. [#999___________________][#1000__________________]   ...24'fps
PTSs: forced, PTS-of-N = PTS-of-0 + integer(N x 3753.75) where 'N' is frame index [note 1] -- Combing: none -- Judder: none.

[note 1] The timebase for DVDs & Blurays (i.e. MPEG2-TS) is 90000tps (ticks per second, aka Hz). When divided by 24'fps, the result is 3753.75tpf (ticks per frame, aka deltaPTS), so forced PTSs step by 3753.75. Since 3753.75tpf is fractional, the resulting PTSs are truncated prior to writing metadata. For example, the forced PTSs of frames #2, #3, #4, #5 are 3753, 7507, 11261, 15015. The truncations have mislead some people to believe that commercial DVD & Bluray content can be VFR (variable frame rate).

cinema-at-25fps-forced (aka PAL speedup) is found on ersatz-PAL DVDs. It is cinema that is tagged for 25fps, with audio that has been downsampled by x0.96.
 cinema pictures: (#1_____________________)(#2_________ .. (#23____________________)(#24____________________)   ...24pps

ENCODER NOTATION: [24pps]25fps & 48KHz[x0.96]48KHz
                   \          \   \_______________\___ audio has been downsampled by x0.96
                    \__________\___ encode and tag video to force x/0.96 video speedup

  encoded frames: [#1____________________][#2__________ .. _][#24___________________]                           ...25fps
PTSs: forced, PTS-of-N = PTS-of-0 + N x 3600 where 'N' is frame index [note 1] -- Combing: none -- Judder: none.

[note 1] The timebase for DVDs & Blurays (i.e. MPEG2-TS) is 90000tps (ticks per second, aka Hz). When divided by 25fps, the result is 3600tpf (ticks per frame, aka deltaPTS), so forced PTSs step by 3600.

cinema-at-25fps-telecined is found on ersatz-PAL DVDs. It is cinema having Euro pulldown. Nothing has been forced, so audio has not been altered.
 cinema pictures: (A+a____________________)(B+b_ .. _____________)(M+m____________ .. (W+w____________________)(X+x____________________)   ...24pps

ENCODER NOTATION: [24pps__48hps__(Aa-Xx)(Aa-LlLm-WxXx)=50hps__25pps]25fps
                   \_______\___\___ unweave             \   \  \___\_____\___ encode
                            \                            \___\______\___ weave
                             \________________________________\___ Euro pulldown (see "Pulldown Primitives")

  encoded frames: [A+a___________________][B+b__ .. [L+l___________________][L+m__ .. _][W+x___________________][X+x___________________]   ...25fps
PTSs: unforced, PTS-of-N = PTS-of-0 + N x 3600 where 'N' is frame index [note 1] -- Combing: 48% -- Judder: 144% @ 1 judder per second.

[note 1] The timebase for DVDs & Blurays (i.e. MPEG2-TS) is 90000tps (ticks per second, aka Hz). When divided by 25fps, the result is 3600tpf (ticks per frame, aka deltaPTS), so PTSs step by 3600.

cinema-at-30'fps (aka hard telecined) is found on ersatz-NTSC DVDs. It is cinema having 2-3-2-3 pulldown, with audio that has been upsampled by x1.001.
 cinema pictures: (A+a_______________)(B+b_______________)(C+c_______________)(D+d_______________)   ...24pps

ENCODER NOTATION: [24pps__48hps__(Aa-Dd)(AaBbBcCdDd)=60hps__30pps]30'fps & 48KHz[x1.001]48KHz
                   \_______\___\___ unweave           \   \  \   \      \   \________________\___ audio has been upsampled by x1.001
                            \                          \   \  \___\______\___ encode and tag video to force x/1.001 slowdown
                             \                          \___\______\___ weave
                              \______________________________\___ 2-3-2-3 pulldown (see "Pulldown Primitives")

  encoded frames: [A+a___________][B+b___________][B+c___________][C+d___________][D+d___________]   ...30'fps
PTSs: forced, PTS-of-N = PTS-of-0 + N x 3003) where 'N' is frame index [note 2] -- Combing: 40% -- Judder: 80% @ 12 judders per second.

[note 2] The timebase for DVDs & Blurays (i.e. MPEG2-TS) is 90000tps (ticks per second, aka Hz). When divided by 30'fps, the result is 3003tpf (ticks per frame, aka deltaPTS), so forced PTSs step by 3003.

cinema-at-30'fps & cinema-at-24'fps-soft mixed segments are more common than viewers may realize. Such a video will usually start at one fps, then switch. One switch is common (for example, between opening production logos and the body of the movie) but cases showing several switches have been encountered.
Specimen: dolby_aurora-DWEU.vob.
The following long analysis is worth examining. It's an actual FFprobe report (with highly modified format) examining a short video: dolby_aurora-DWEU.vob, and is quite informative.
• It shows that fps can change in midstream, and
• It shows how FFprobe tags: 'interlaced_frame' 'top_field_first' 'repeat_pict', can be used to differentiate between cinema-at-30'fps and cinema-at-24'fps-soft, and
• It reveals some surprises.
frames.frame.-7                    0     ---.
frames.frame.-6                    3003     ¦ Surprise: 7 frames were clipped but PTSs were not updated, so 'frames.frame.2.pts=27027' is bogus.
frames.frame.-5                    6006     ¦
frames.frame.-4                    9009     ¦
frames.frame.-3                    12012    ¦
frames.frame.-2                    15015    ¦
frames.frame.-1                    18018    ¦
frames.frame.0.pict_type="B"  .pts=21021    ¦ Surprise: FFprobe reports PTSs for non-key frames [note 1].
frames.frame.1.pict_type="B"  .pts=24024 ---'
frames.frame.2.key_frame=1    .pts=27027                          ---.
                                 I = 'interlaced_frame'              ¦ (243243-27027)/(74-2) = 3003 [note 2]
                                 : T = 'top_field_first'             ¦        \                    \
                                 : : R = 'repeat_pict'               ¦         frame.74.pts         90000tps/3003tpf = 30'fps
                                 : : :                               ¦
frames.frame.2.pict_type="I"     I T -   ...............[C+d]        ¦
frames.frame.3.pict_type="B"     I T -   ....................[D+d]   ¦
frames.frame.4.pict_type="B"     I T -   [A+a]                       ¦
frames.frame.5.pict_type="P"     I T -   .....[B+b]                  ¦
frames.frame.6.pict_type="B"     I T -   ..........[B+c]             ¦ [note 3]
frames.frame.7.pict_type="B"     I T -   ...............[C+d]        ¦
frames.frame.8.pict_type="P"     I T -   ....................[D+d]   ¦
frames.frame.9.pict_type="B"     I T -   [A+a]                       ¦
frames.frame.10.pict_type="B"    I T -   .....[B+b]                  ¦
frames.frame.11.pict_type="P"    I T -   ..........[B+c]             ¦
frames.frame.12.pict_type="B"    I T -   ...............[C+d]        ¦
frames.frame.13.pict_type="B"    I T -   ....................[D+d]   ¦
             :                                                       ¦
frames.frame.73.pict_type="B"                                     ---'
================================ THE STREAM SWITCHES FROM CINEMA-AT-30'FPS (ABOVE) TO CINEMA-AT-24'FPS-SOFT (BELOW) EXCEPT ---.
frames.frame.74.key_frame=1   .pts=243243                         ---.                                                        ¦
frames.frame.74.pict_type="I"    I T -    [A+a]                      ¦ (1009008-243243)/(278-74) = 3753.75                    ¦
frames.frame.75.pict_type="B"    - T R    .....[B+b]                 ¦         \                          \                   ¦
frames.frame.76.pict_type="B"    I - -    ..........[C+c]            ¦          frame.278.pts              24'fps             ¦
frames.frame.77.pict_type="P"    - - R    ...............[D+d]       ¦                                                        ¦
frames.frame.78.pict_type="B"    I T -    [A+a]                      ¦                                                        ¦
frames.frame.79.pict_type="B"    - T R    .....[B+b]                 ¦                                                        ¦
frames.frame.80.pict_type="P"    I - -    ..........[C+c]            ¦                                                        ¦
frames.frame.81.pict_type="B"    - - R    ...............[D+d]       ¦                                                        ¦
frames.frame.82.pict_type="B"    I T -    [A+a]                      ¦                                                        ¦
frames.frame.83.pict_type="P"    - T R    .....[B+b]                 ¦                                                        ¦
frames.frame.84.pict_type="B"    I - -    ..........[C+c]            ¦                                                        ¦
frames.frame.85.pict_type="B"    - - R    ...............[D+d]       ¦                                                        ¦
             :                                                       ¦                                                        ¦
frames.frame.277.pict_type="B"                                    ---'                                                        ¦
frames.frame.278.key_frame=1  .pts=1009008                        ---.                                                        ¦
frames.frame.278.pict_type="I"   I T -   [A+a]                       ¦ (1049549-1009008)/12 = 3378.41[6..]                    ¦
frames.frame.279.pict_type="B"   - T R   .....[B+b]                  ¦         \                          \                   ¦
frames.frame.280.pict_type="B"   I - -   ..........[C+c]             ¦          frame.290.pts              26.639698fps       ¦
frames.frame.281.pict_type="P"   - - R   ...............[D+d]        ¦                                     [note 4]           ¦
frames.frame.282.pict_type="B"   I T -   [A+a]                       ¦ ---.                                                   ¦
frames.frame.283.pict_type="B"   I T -   .....[B+b]                  ¦    ¦ 7 FRAMES OF CINEMA-AT-30'FPS [note 1] <-----------'
frames.frame.284.pict_type="P"   I T -   ..........[B+c]             ¦    ¦ <-- visible combing in this frame
frames.frame.285.pict_type="B"   I T -   ...............[C+d]        ¦    ¦ <-- visible combing in this frame
frames.frame.286.pict_type="B"   I T -   ....................[D+d]   ¦    ¦
frames.frame.287.pict_type="P"   I T -   [A+a]                       ¦    ¦
frames.frame.288.pict_type="B"   I T -   .....[B+b]                  ¦ ---'
frames.frame.289.pict_type="B"   - T R   .....[B+b]               ---'
frames.frame.290.key_frame=1  .pts=1049549                        ---.
frames.frame.290.pict_type="I"   I - -   ..........[C+c]             ¦ (3076574-1049549)/(830-290) = 3753.75
             :                                                       ¦         \                            \
frames.frame.829.pict_type="B"                                    ---'          frame.830.pts                24'fps
frames.frame.830.key_frame=1  .pts=3076574
frames.frame.830.pict_type="I"
frames.frame.831.pict_type="P"           last frame
[note 1] FFprobe misleading: Despite what FFprobe shows, PTS metadata is actually stored solely for key frames. By listing PTSs for non-key frames, FFprobe is just trying to be 'helpful' but it also misleads. For example, for frame 284, FFprobe reports 'frames.frame.284.pts="N/A"' without explanation.

[note 2] Curiously, MPV displays "0.300" as the time of its 10th frame whereas "0.300" is actually the time of the 3rd frame (i.e. 'frames.frame.2'). Is MPV fabricating the missing 7 frames? Based on frame-by-frame stepping within MPV, it does appear so.

[note 3] The pulldown character of frames 2-73 could not be visually confirmed (for example, by looking for combing) because the frames are black.

[note 4] During this 12 frame sequence, MPV's "FPS: (estimated)" status is disturbed. Whenever that happens, fps switches are occurring.

ersatz-PAL is 50sps scans that, on both Blurays & DVDs, have been interlaced to make frames containing quasi-pictures. Nothing has been forced, so audio has not been altered.
    PAL TV scans: [A][b]   ...50sps

ENCODER NOTATION: 50sps[25pps]25fps
                   \     \___\_____\___ encode
                    \_________\___ interlace

  quasi pictures: (A+b_)   ...25pps
  encoded frames: [A+b_]   ...25fps
PTSs: unforced -- Combing: 100% -- Judder: none.

ersatz-NTSC is 60'sps scans, that, on both Blurays & DVDs, have been interlaced to make frames containing quasi-pictures. Nothing has been forced, so audio has not been altered.
   NTSC TV scans: [A][b]   ...60'sps

ENCODER NOTATION: 60'sps[30'pps]30'fps
                   \      \____\______\___ encode
                    \___________\___ interlace

  quasi pictures: (A+b_)   ...30'pps
  encoded frames: [A+b_]   ...30'fps
PTSs: unforced -- Combing: 100% -- Judder: none.

ersatz-PAL & cinema-at-25fps-forced mixed segments are typically found in "Making Of" documentaries. In the mix, ersatz-PAL segments have been interlaced, cinema segments are tagged for 25fps, and cinema audio (only) has been downsampled by x0.96.

ersatz-PAL & cinema-at-25fps-telecined mixed segments are typically found in "Making Of" documentaries. In the mix, ersatz-PAL segments have been interlaced, and cinema segments (only) have been hard telecined to 25pps. Nothing has been forced, so audio has not been altered.

ersatz-NTSC & cinema-at-30'fps mixed segments are typically found in "Making Of" documentaries. In the mix, ersatz-NTSC segments have been interlaced, cinema segments (only) have been hard telecined to 30pps, then tagged for 30'fps, and cinema audio (only) has been upsampled by x1.001.