Matterhorn 28-014 · PDF/UA-1 UA1:7.18.6.2-1
PDF video with no content type: the media clip's /CT entry
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
| Standard | Reference |
|---|---|
| Matterhorn Protocol 1.1 | Checkpoint 28 (Annotations), index 28-014 |
| PDF/UA-1 (ISO 14289-1) | Clause 7.18.6.2-1 |
| WCAG 2.1 | 1.1.1 Non-text Content — Level A |
| EN 301 549 / Section 508 / ADA Title II | All 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. |
Related conditions
- 28-015 Alt entry is missing from the media clip data dictionaryMedia clips require an /Alt array giving a text description.
- 28-004 An annotation has neither a Contents entry nor an alternative descriptionEvery non-widget annotation needs an accessible description, either in its own /Contents or in the /Alt of the structure element that encloses it.
- 28-002 An annotation is not a direct child of an Annot structure elementNon-widget, non-link annotations must sit inside an Annot structure element so they have a place in the reading order.
- 13-004 Figure tag alternative or replacement text missingA Figure element has neither /Alt nor /ActualText. Every Figure must have one or the other; if the image is decorative it should be an artifact instead of a Figure.
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.
- 28-001 An annotation is not in correct reading orderThe annotation's position in the structure tree does not match where it appears on the page.
- 28-002 An annotation is not a direct child of an Annot structure elementNon-widget, non-link annotations must sit inside an Annot structure element so they have a place in the reading order.
- 28-003 An annotation is used for visual formatting but is not tagged according to its semantic functionA Square or Line annotation used to draw a box round a callout is decoration and should be artifacted, or tagged for what it actually means.
- 28-004 An annotation has neither a Contents entry nor an alternative descriptionEvery non-widget annotation needs an accessible description, either in its own /Contents or in the /Alt of the structure element that encloses it.
- 28-005 A form field has neither a TU entry nor an alternative descriptionThe /TU tooltip is the accessible name of a PDF form field. Without it the field has no name at all — the visible label printed next to it is not connected to the control.
- 28-006 An annotation with subtype undefined in ISO 32000 does not meet 7.18.1A custom annotation subtype still has to be placed in the structure tree and described.
- 28-007 An annotation of subtype TrapNet existsTrapNet annotations are prepress artefacts and are forbidden in PDF/UA-1.
- 28-008 A page containing an annotation does not contain a Tabs entryAny page carrying annotations must declare a tab order. PDF/UA-1 requires /Tabs /S — tab order follows the structure tree.
- 28-009 A page containing an annotation has a Tabs entry with a value other than S/Tabs is present but set to /R (row order) or /C (column order) rather than /S (structure order).
- 28-010 A widget annotation is not nested within a Form tagEvery form control must sit inside a Form structure element.
- 28-011 A link annotation is not nested within a Link tagA link annotation must be a child of a Link structure element containing the link's text, joined by an object reference (/OBJR).
- 28-012 A link annotation does not include an alternate description in its Contents entryLink annotations need /Contents describing where the link goes.
- 28-013 An IsMap entry is true but the functionality is not provided in some other wayA server-side image map requires pointing at a pixel, which is not possible without a mouse.
- 28-015 Alt entry is missing from the media clip data dictionaryMedia clips require an /Alt array giving a text description.
- 28-016 File attachment annotations do not conform to 7.11The file specification referenced by a FileAttachment annotation must carry both /F and /UF.
- 28-017 A PrinterMark annotation is included in the logical structureCrop marks and registration targets are production artefacts and must not appear in the structure tree.
- 28-018 The appearance stream of a PrinterMark annotation is not marked as ArtifactThe content inside a PrinterMark's appearance stream must itself be artifacted.
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.
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 .