Older/MediaServer/libmov/source/mov-iods.c

91 lines
2.8 KiB
C
Raw Permalink Normal View History

2024-10-01 00:12:57 +08:00
#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;
}