91 lines
2.8 KiB
C
91 lines
2.8 KiB
C
|
#include "mov-internal.h"
|
||
|
#include <assert.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <errno.h>
|
||
|
|
||
|
// 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;
|
||
|
}
|