📄 esds.c
字号:
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is MPEG4IP.
*
* The Initial Developer of the Original Code is Cisco Systems Inc.
* Portions created by Cisco Systems Inc. are
* Copyright (C) Cisco Systems Inc. 2000, 2001. All Rights Reserved.
*
* Contributor(s):
* Dave Mackie dmackie@cisco.com
*/
#include "quicktime.h"
int quicktime_esds_init(quicktime_esds_t *esds)
{
esds->version = 0;
esds->flags = 0;
esds->decoderConfigLen = 0;
esds->decoderConfig = NULL;
return 0;
}
int quicktime_esds_get_decoder_config(quicktime_esds_t* esds, u_char** ppBuf, int* pBufSize)
{
if (esds->decoderConfig == NULL || esds->decoderConfigLen == 0) {
*ppBuf = NULL;
*pBufSize = 0;
} else {
*ppBuf = malloc(esds->decoderConfigLen);
if (*ppBuf == NULL) {
*pBufSize = 0;
return 1;
}
memcpy(*ppBuf, esds->decoderConfig, esds->decoderConfigLen);
*pBufSize = esds->decoderConfigLen;
}
return 0;
}
int quicktime_esds_set_decoder_config(quicktime_esds_t* esds, u_char* pBuf, int bufSize)
{
free(esds->decoderConfig);
esds->decoderConfig = malloc(bufSize);
if (esds->decoderConfig) {
memcpy(esds->decoderConfig, pBuf, bufSize);
esds->decoderConfigLen = bufSize;
return 0;
}
return 1;
}
int quicktime_esds_delete(quicktime_esds_t *esds)
{
free(esds->decoderConfig);
return 0;
}
int quicktime_esds_dump(quicktime_esds_t *esds)
{
int i;
printf(" elementary stream descriptor\n");
printf(" version %d\n", esds->version);
printf(" flags %ld\n", esds->flags);
printf(" decoder config ");
for (i = 0; i < esds->decoderConfigLen; i++) {
printf("%02x ", esds->decoderConfig[i]);
}
printf("\n");
}
int quicktime_read_esds(quicktime_t *file, quicktime_esds_t *esds)
{
u_int8_t tag;
u_int32_t length;
esds->version = quicktime_read_char(file);
esds->flags = quicktime_read_int24(file);
/* get and verify ES_DescrTag */
tag = quicktime_read_char(file);
if (tag == 0x03) {
/* read length */
if (quicktime_read_mp4_descr_length(file) < 5 + 15) {
return 1;
}
/* skip 3 bytes */
quicktime_set_position(file, quicktime_position(file) + 3);
} else {
/* skip 2 bytes */
quicktime_set_position(file, quicktime_position(file) + 2);
}
/* get and verify DecoderConfigDescrTab */
if (quicktime_read_char(file) != 0x04) {
return 1;
}
/* read length */
if (quicktime_read_mp4_descr_length(file) < 15) {
return 1;
}
/* skip 13 bytes */
quicktime_set_position(file, quicktime_position(file) + 13);
/* get and verify DecSpecificInfoTag */
if (quicktime_read_char(file) != 0x05) {
return 1;
}
/* read length */
esds->decoderConfigLen = quicktime_read_mp4_descr_length(file);
free(esds->decoderConfig);
esds->decoderConfig = malloc(esds->decoderConfigLen);
if (esds->decoderConfig) {
quicktime_read_data(file, esds->decoderConfig, esds->decoderConfigLen);
} else {
esds->decoderConfigLen = 0;
}
/* will skip the remainder of the atom */
return 0;
}
int quicktime_write_esds_common(quicktime_t *file, quicktime_esds_t *esds, int esid, u_int objectType, u_int streamType)
{
quicktime_atom_t atom;
if (!file->use_mp4) {
return 0;
}
quicktime_atom_write_header(file, &atom, "esds");
quicktime_write_char(file, esds->version);
quicktime_write_int24(file, esds->flags);
quicktime_write_char(file, 0x03); /* ES_DescrTag */
quicktime_write_mp4_descr_length(file,
3 + (5 + (13 + (5 + esds->decoderConfigLen))) + 3, FALSE);
quicktime_write_int16(file, esid);
quicktime_write_char(file, 0x10); /* streamPriorty = 16 (0-31) */
/* DecoderConfigDescriptor */
quicktime_write_char(file, 0x04); /* DecoderConfigDescrTag */
quicktime_write_mp4_descr_length(file,
13 + (5 + esds->decoderConfigLen), FALSE);
quicktime_write_char(file, objectType); /* objectTypeIndication */
quicktime_write_char(file, streamType); /* streamType */
quicktime_write_int24(file, 0); /* buffer size */
quicktime_write_int32(file, 0); /* max bitrate */
quicktime_write_int32(file, 0); /* average bitrate */
quicktime_write_char(file, 0x05); /* DecSpecificInfoTag */
quicktime_write_mp4_descr_length(file, esds->decoderConfigLen, FALSE);
quicktime_write_data(file, esds->decoderConfig, esds->decoderConfigLen);
/* SLConfigDescriptor */
quicktime_write_char(file, 0x06); /* SLConfigDescrTag */
quicktime_write_char(file, 0x01); /* length */
quicktime_write_char(file, 0x02); /* constant in mp4 files */
/* no IPI_DescrPointer */
/* no IP_IdentificationDataSet */
/* no IPMP_DescriptorPointer */
/* no LanguageDescriptor */
/* no QoS_Descriptor */
/* no RegistrationDescriptor */
/* no ExtensionDescriptor */
quicktime_atom_write_footer(file, &atom);
}
int quicktime_write_esds_audio(quicktime_t *file, quicktime_esds_t *esds, int esid)
{
return quicktime_write_esds_common(file, esds, esid, (u_int)0x40, (u_int)0x05);
}
int quicktime_write_esds_video(quicktime_t *file, quicktime_esds_t *esds, int esid)
{
return quicktime_write_esds_common(file, esds, esid, (u_int)0x20, (u_int)0x04);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -