Overview
As part of a project to write an MPEG-4 (MP4) file parser, I need to understand how an extended box (or chunk) size is processed within an MP4 file. When I tried to manually simulate an MP4 file with an extended box size, media players report that the file is invalid.
Technical Information
Paraphrasing the MPEG-4 specification:
An MP4 file is formed as a series of objects called 'boxes'. All data is contained in boxes, there is no other data within the file.
Here is a screen capture of Section 4.2: Object Structure, which describes the box header and its size and type fields:
Most MP4 box headers contain two fields: a 32-bit compact box size and a 32-bit box type. The compact box size supports a box's data up to 4 GB. Occasionally an MP4 box may have more data than that (e.g., a large video file). In this case, the compact box size is set to 1, and eight (8) octets are added immediately following the box type. This 64-bit number is known as the 'extended box size', and supports a box's size up to 2^64.
To understand the extended box size better, I took a simple MP4 file and wanted to modify the moov/trak/mdia
box to use the extended box size, rather than the compact size.
Here is what the MP4 file looks like before modifying it. The three box headers are highlighted in RED:
My plan was as follows:
- Modify the
moov/trak/mdia
box- In the
moov/trak/mdia
, insert eight (8) octets immediately following the box type ('mdia'). This will eventually be our extended box size. - Copy the compact box size to the newly-inserted extended box size, adding 8 to the size to compensate for the newly inserted octets. The size is inserted in big-endian order.
- Set the compact size to 1.
- In the
- Modify the
moov/trak
box- Add 8 to the existing compact box size (to compensate for the eight octets added to
mdia
).
- Add 8 to the existing compact box size (to compensate for the eight octets added to
- Modify the
moov
box- Add 8 to the existing compact box size (again, to compensate for the eight octets in
mdia
)
- Add 8 to the existing compact box size (again, to compensate for the eight octets in
Here's what the MP4 file looks like now, with the modified octets are in RED:
What have we done?
We have told the MP4 parser/player to take the moov/trak/mdia
box size from the extended field rather than the compact size field, and have increased all parent boxes by eight (8) to compensate for the newly-inserted extended box size in the mdia
box.
What's the problem?
When I attempt to play the modified MP4 file I receive error messages from different media players:
Why do the media players see the modified file as invalid MP4?
- Did I need to alter any other fields?
- Does the extended box size have to be greater than 2^32?
- Can it be that only specific box types support extended box size (e.g., Media Data)?