#include "mov-internal.h" #include #include #include // Table 1 - List of Class Tags for Descriptors (p31) /* 0x10 MP4_IOD_Tag 0x11 MP4_OD_Tag */ // 7.2.2.2 BaseDescriptor (p32) /* abstract aligned(8) expandable(2^28-1) class BaseDescriptor : bit(8) tag=0 { // empty. To be filled by classes extending this class. } */ // 7.2.6.2 ObjectDescriptorBase (p42) /* abstract class ObjectDescriptorBase extends BaseDescriptor : bit(8) tag=[ObjectDescrTag..InitialObjectDescrTag] { // empty. To be filled by classes extending this class. } class ObjectDescriptor extends ObjectDescriptorBase : bit(8) tag=ObjectDescrTag { bit(10) ObjectDescriptorID; bit(1) URL_Flag; const bit(5) reserved=0b1111.1; if (URL_Flag) { bit(8) URLlength; bit(8) URLstring[URLlength]; } else { ES_Descriptor esDescr[1 .. 255]; OCI_Descriptor ociDescr[0 .. 255]; IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; IPMP_Descriptor ipmpDescr [0 .. 255]; } ExtensionDescriptor extDescr[0 .. 255]; } */ // 7.2.6.4 InitialObjectDescriptor (p44) /* class InitialObjectDescriptor extends ObjectDescriptorBase : bit(8) tag=InitialObjectDescrTag { bit(10) ObjectDescriptorID; bit(1) URL_Flag; bit(1) includeInlineProfileLevelFlag; const bit(4) reserved=0b1111; if (URL_Flag) { bit(8) URLlength; bit(8) URLstring[URLlength]; } else { bit(8) ODProfileLevelIndication; bit(8) sceneProfileLevelIndication; bit(8) audioProfileLevelIndication; bit(8) visualProfileLevelIndication; bit(8) graphicsProfileLevelIndication; ES_Descriptor esDescr[1 .. 255]; OCI_Descriptor ociDescr[0 .. 255]; IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; IPMP_Descriptor ipmpDescr [0 .. 255]; IPMP_ToolListDescriptor toolListDescr[0 .. 1]; } ExtensionDescriptor extDescr[0 .. 255]; } */ size_t mov_write_iods(const struct mov_t* mov) { size_t size = 12 /* full box */ + 12 /* InitialObjectDescriptor */; mov_buffer_w32(&mov->io, 24); /* size */ mov_buffer_write(&mov->io, "iods", 4); mov_buffer_w32(&mov->io, 0); /* version & flags */ mov_buffer_w8(&mov->io, 0x10); // ISO_MP4_IOD_Tag mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (7 >> 21))); mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (7 >> 14))); mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (7 >> 7))); mov_buffer_w8(&mov->io, (uint8_t)(0x7F & 7)); mov_buffer_w16(&mov->io, 0x004f); // objectDescriptorId 1 mov_buffer_w8(&mov->io, 0xff); // No OD capability required mov_buffer_w8(&mov->io, 0xff); mov_buffer_w8(&mov->io, 0xFF); mov_buffer_w8(&mov->io, 0xFF); // no visual capability required mov_buffer_w8(&mov->io, 0xff); return size; }