Matterhorn 28-014 · PDF/UA-1 UA1:7.18.6.2-1

PDF video with no content type: the media clip's /CT entry

BlockerCheckpoint 28: AnnotationsWCAG 1.1.1 (A)

The media clip's content type (/CT) is required so a processor knows what it is being asked to play.

The condition, as the protocol states it. “CT entry is missing from the media clip data dictionary.”

Matterhorn Protocol 1.1, checkpoint 28, index 28-014, section UA1:7.18.6.2-1. Software can decide this one on its own.

What a screen reader actually does

The reader cannot describe or delegate the media.

Where the media clip sits

A PDF does not put a video on a page directly. It puts a Screen annotation there — the rectangle the video plays in — and gives it an action. The action is a rendition action, which names a media rendition, which holds a media clip data dictionary, which finally points at the bytes. Four objects deep:

12 0 obj
<< /Type /Annot /Subtype /Screen
   /Rect [ 72 400 372 600 ]
   /Contents (Walkthrough video)
   /A << /S /Rendition /OP 0 /AN 12 0 R          % play, in this annotation
         /R << /S /MR                             % media rendition
               /C << /S /MCD                      % media clip data
                     /D 14 0 R                    % walkthrough.mp4, embedded
                     /CT (video/mp4)              % ← this condition
                     /Alt [ (en-GB) (…) ]         % ← 28-015
                  >>
            >>
      >>
>>
endobj

ISO 32000-1 requires only /S and /D in the media clip. /CT, the content type, is optional there. PDF/UA-1 clause 7.18.6.2 makes it mandatory, along with /Alt, which is condition 28-015. This page is about the first of the two.

What the content type is for

/CT is a MIME type, written as an ASCII string — (video/mp4), (audio/mpeg). It says what kind of data /D holds without anybody having to open it.

That matters to anything that has to decide what to do with the clip before playing it: a viewer choosing a player, a converter deciding whether the clip can be carried into another format, an assistive tool deciding whether it is dealing with sound or pictures. Without it, the decision is made from the first bytes of the data or from the extension on a file name — and an embedded file’s name is whatever somebody typed, while /D may not be a file name at all.

For a person using a screen reader the effect is indirect but real. Whether an alternative is enough depends on what the media is: a sound clip needs a transcript, a silent video needs a description, a narrated one needs both. A document that does not say which it is has left that to be guessed.

Where it comes from

Any writer that fills in the entries ISO 32000-1 requires and stops. /D is required, /CT is “optional”, and a producer working from the base specification has no reason to write it. The Screen-and-rendition model dates from PDF 1.5, nearly a decade before PDF/UA-1, and a producer written against it then had nothing telling it the optional entry would one day be required.

The condition does not apply to every kind of media object. A Movie annotation (the PDF 1.2 model) and a RichMedia annotation keep their media in structures of their own, with no media clip data dictionary in them; 7.18.6.2 is about the Screen-and-rendition model shown above.

How to check it free

veraPDF tests it. Its PDF/UA-1 profile reports a missing /CT against clause 7.18.6.2 with the message “CT key is missing from the media clip data dictionary”. It finds clips by following rendition actions, which is the path above.

Acrobat Pro has no documented check for it. Adobe’s description of the Accessibility Checker lists a Tagged multimedia rule (is the media in the tag tree?) and an Other elements alternate text rule (does the structure element have alternate text?). Both are about the structure tree, not about the clip’s own dictionary, so a pass on either says nothing about /CT.

A few lines of Python with the free pikepdf library will list every clip and what it declares:

import pikepdf

with pikepdf.open("course.pdf") as pdf:
    for number, page in enumerate(pdf.pages, start=1):
        for annot in page.get("/Annots", []):
            action = annot.get("/A")
            if annot.get("/Subtype") != "/Screen" or action is None:
                continue
            rendition = action.get("/R")
            clip = rendition.get("/C") if rendition is not None else None
            if clip is not None:
                print(number, "CT:", clip.get("/CT"), "Alt:", clip.get("/Alt"))

A selector rendition (/S /SR) holds a list of renditions rather than one, and each needs checking; the script above handles the common single case.

How to fix it free

Acrobat has no field for it. Adobe documents adding media through All tools → View more → Add rich media → Video (or Sound), and the advanced options of the Insert dialog as a Launch Settings tab, a Controls tab and a Video tab — activation, border, poster image, playback skin, trimming, chapter points (Adobe: Add audio, video, and interactive objects to PDFs). None of them is a content type. If a file needs /CT added, Acrobat’s documented interface is not where it happens.

Add it at object level. It is one entry, and it changes nothing about how the media plays:

clip["/CT"] = pikepdf.String("video/mp4")
pdf.save("course-fixed.pdf")

Use the type of the data itself. If you are not sure what an embedded file really is, extract it and ask the operating system (file walkthrough.mp4 on macOS or Linux), rather than trusting the name.

Or take the media out of the PDF. A link to the video hosted somewhere with its own captions and transcript is often the better document: the PDF stays small, the video stays maintainable, and the link is a Link structure element with text a screen reader can announce. This is a decision about the document rather than a repair, but it is frequently the right one.

What Taggart does

For every Screen, Movie and RichMedia annotation, Taggart follows the annotation’s own actions — /A, the entries of /AA, and any /Next chain — to each rendition action, then through the rendition to the media clip: a media rendition’s /C, every rendition in a selector rendition’s list, and through a clip section to the clip it describes. A clip with no /CT is reported against the annotation:

The media clip data dictionary of a /Screen annotation on page 1 has no /CT content-type entry.

Two limits, both worth knowing before you read a clean report as a pass:

  • It checks that the entry is there, not what it says. An empty /CT () passes, and so does a type that does not match the data.
  • It reads the annotation’s own actions only. A Link that plays the clip in a Screen annotation, or a page action that starts it, is not followed. veraPDF, which reads rendition actions wherever they are, will find those clips.

There is no repair: Taggart will not write a content type into a file, because the right value depends on what the data is, and it does not inspect the data to find out.

How Taggart handles it

Taggart checks for this condition automatically and reports it as a blocker, with where in the file it found it.

Whatever Taggart changes, the page still looks identical. Fixes edit the PDF object model, not the content streams, and every remediation is re-rendered and compared against the original at structural similarity ≥ 0.999 before you get the file back. A tool that quietly reflows your document is worse than no tool.

Frequently asked questions

Is /CT not optional?

In ISO 32000-1 it is. PDF/UA-1 makes it required: clause 7.18.6.2 takes the media clip data dictionary as ISO 32000-1 defines it and adds the content type and the alternate description to the entries a conforming file must have. A file can be valid PDF and fail this condition.

What value goes in /CT?

The MIME type of the data the clip points at, as an ASCII string: video/mp4 for an MP4, audio/mpeg for an MP3, video/quicktime for a MOV. It describes the bytes in /D, not the file name, so a renamed file still needs the type of what it actually is.

Does Acrobat's Accessibility Checker catch it?

Adobe does not describe it as doing so. The checker's Tagged multimedia rule is documented as checking that multimedia is in the tag tree or an artifact, and Other elements alternate text as checking alternate text on structure elements. Neither is described as reading the media clip's own entries. veraPDF does test /CT, under clause 7.18.6.2.

Does Taggart report it?

Yes, for a clip played by a Screen annotation's own actions: Taggart follows the rendition action, through selector renditions and the annotation's additional actions, to the media clip and reports a clip with no /CT. It checks that the entry is there, not what it says, and it does not follow a rendition started from somewhere else, such as a link.

Where this sits in the standards

Standards this condition maps to
StandardReference
Matterhorn Protocol 1.1Checkpoint 28 (Annotations), index 28-014
PDF/UA-1 (ISO 14289-1)Clause 7.18.6.2-1
WCAG 2.11.1.1 Non-text Content — Level A
EN 301 549 / Section 508 / ADA Title IIAll three point at WCAG 2.1 Level AA for non-web documents, so a Level A or AA criterion here is in scope for each of them.

Other conditions in checkpoint 28

Checkpoint 28 covers annotations. These are its other failure conditions; the ones without a link are in the rule set but do not have a written page yet.

Check your own file. Taggart’s validator is free and unlimited — 75 of the 87 Matterhorn conditions software can decide, with the other 12 listed for you to confirm; no watermark, no expiry, and no account needed up to 60 pages.

Check a PDF free

Checked with Taggart on a generated file that fails this condition on . The Acrobat steps follow Adobe’s documentation and were not walked through by hand. Last updated .