ref: 37da9bcec4e98d7bbc29407e534ac4c857d4ddb4
parent: 776e8953fca4796a7b80e03784005f243d842395
author: menno <menno>
date: Tue Jul 27 05:06:57 EDT 2004
removed mp4av library too only used in winamp plugin
--- a/common/mp4av/aac.cpp
+++ /dev/null
@@ -1,179 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-/*
- * AAC Config in ES:
- *
- * AudioObjectType 5 bits
- * samplingFrequencyIndex 4 bits
- * if (samplingFrequencyIndex == 0xF)
- * samplingFrequency 24 bits
- * channelConfiguration 4 bits
- * GA_SpecificConfig
- * FrameLengthFlag 1 bit 1024 or 960
- * DependsOnCoreCoder 1 bit (always 0)
- * ExtensionFlag 1 bit (always 0)
- */
-
-extern "C" u_int8_t MP4AV_AacConfigGetSamplingRateIndex(u_int8_t* pConfig)
-{
- return ((pConfig[0] << 1) | (pConfig[1] >> 7)) & 0xF;
-}
-
-extern "C" u_int32_t MP4AV_AacConfigGetSamplingRate(u_int8_t* pConfig)
-{
- u_int8_t index =
- MP4AV_AacConfigGetSamplingRateIndex(pConfig);
-
- if (index == 0xF) {
- return (pConfig[1] & 0x7F) << 17
- | pConfig[2] << 9
- | pConfig[3] << 1
- | (pConfig[4] >> 7);
- }
- return AdtsSamplingRates[index];
-}
-
-extern "C" u_int16_t MP4AV_AacConfigGetSamplingWindow(u_int8_t* pConfig)
-{
- u_int8_t adjust = 0;
-
- if (MP4AV_AacConfigGetSamplingRateIndex(pConfig) == 0xF) {
- adjust = 3;
- }
-
- if ((pConfig[1 + adjust] >> 2) & 0x1) {
- return 960;
- }
- return 1024;
-}
-
-extern "C" u_int8_t MP4AV_AacConfigGetChannels(u_int8_t* pConfig)
-{
- u_int8_t adjust = 0;
-
- if (MP4AV_AacConfigGetSamplingRateIndex(pConfig) == 0xF) {
- adjust = 3;
- }
- return (pConfig[1 + adjust] >> 3) & 0xF;
-}
-
-extern "C" bool MP4AV_AacGetConfigurationFromAdts(
- u_int8_t** ppConfig,
- u_int32_t* pConfigLength,
- u_int8_t* pHdr)
-{
- return MP4AV_AacGetConfiguration(
- ppConfig,
- pConfigLength,
- MP4AV_AdtsGetProfile(pHdr),
- MP4AV_AdtsGetSamplingRate(pHdr),
- MP4AV_AdtsGetChannels(pHdr));
-}
-
-extern "C" bool MP4AV_AacGetConfiguration(
- u_int8_t** ppConfig,
- u_int32_t* pConfigLength,
- u_int8_t profile,
- u_int32_t samplingRate,
- u_int8_t channels)
-{
- /* create the appropriate decoder config */
-
- u_int8_t* pConfig = (u_int8_t*)malloc(2);
-
- if (pConfig == NULL) {
- return false;
- }
-
- u_int8_t samplingRateIndex =
- MP4AV_AdtsFindSamplingRateIndex(samplingRate);
-
- pConfig[0] =
- ((profile + 1) << 3) | ((samplingRateIndex & 0xe) >> 1);
- pConfig[1] =
- ((samplingRateIndex & 0x1) << 7) | (channels << 3);
-
- /* LATER this option is not currently used in MPEG4IP
- if (samplesPerFrame == 960) {
- pConfig[1] |= (1 << 2);
- }
- */
-
- *ppConfig = pConfig;
- *pConfigLength = 2;
-
- return true;
-}
-
-extern "C" bool MP4AV_AacGetConfiguration_SBR(
- u_int8_t** ppConfig,
- u_int32_t* pConfigLength,
- u_int8_t profile,
- u_int32_t samplingRate,
- u_int8_t channels)
-{
- /* create the appropriate decoder config */
-
- u_int8_t* pConfig = (u_int8_t*)malloc(5);
- pConfig[0] = 0;
- pConfig[1] = 0;
- pConfig[2] = 0;
- pConfig[3] = 0;
- pConfig[4] = 0;
-
- if (pConfig == NULL) {
- return false;
- }
-
- u_int8_t samplingRateIndex =
- MP4AV_AdtsFindSamplingRateIndex(samplingRate);
-
- pConfig[0] =
- ((profile + 1) << 3) | ((samplingRateIndex & 0xe) >> 1);
- pConfig[1] =
- ((samplingRateIndex & 0x1) << 7) | (channels << 3);
-
- /* pConfig[0] & pConfig[1] now contain the backward compatible
- AudioSpecificConfig
- */
-
- /* SBR stuff */
- const u_int16_t syncExtensionType = 0x2B7;
- u_int8_t extensionSamplingRateIndex =
- MP4AV_AdtsFindSamplingRateIndex(2*samplingRate);
-
- pConfig[2] = (syncExtensionType >> 3) & 0xFF;
- pConfig[3] = ((syncExtensionType & 0x7) << 5) | 5 /* ext ot id */;
- pConfig[4] = ((1 & 0x1) << 7) | (extensionSamplingRateIndex << 3);
-
- *ppConfig = pConfig;
- *pConfigLength = 5;
-
- return true;
-}
--- a/common/mp4av/adts.cpp
+++ /dev/null
@@ -1,277 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-/*
- * ADTS Header:
- * MPEG-2 version 56 bits (byte aligned)
- * MPEG-4 version 56 bits (byte aligned) - note - changed for 0.99 version
- *
- * syncword 12 bits
- * id 1 bit
- * layer 2 bits
- * protection_absent 1 bit
- * profile 2 bits
- * sampling_frequency_index 4 bits
- * private 1 bit
- * channel_configuraton 3 bits
- * original 1 bit
- * home 1 bit
- * copyright_id 1 bit
- * copyright_id_start 1 bit
- * aac_frame_length 13 bits
- * adts_buffer_fullness 11 bits
- * num_raw_data_blocks 2 bits
- *
- * if (protection_absent == 0)
- * crc_check 16 bits
- */
-
-u_int32_t AdtsSamplingRates[NUM_ADTS_SAMPLING_RATES] = {
- 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
- 16000, 12000, 11025, 8000, 7350, 0, 0, 0
-};
-
-/*
- * compute ADTS frame size
- */
-extern "C" u_int16_t MP4AV_AdtsGetFrameSize(u_int8_t* pHdr)
-{
- /* extract the necessary fields from the header */
- uint16_t frameLength;
-
- frameLength = (((u_int16_t)(pHdr[3] & 0x3)) << 11)
- | (((u_int16_t)pHdr[4]) << 3) | (pHdr[5] >> 5);
-
- return frameLength;
-}
-
-/*
- * Compute length of ADTS header in bits
- */
-extern "C" u_int16_t MP4AV_AdtsGetHeaderBitSize(u_int8_t* pHdr)
-{
- u_int8_t hasCrc = !(pHdr[1] & 0x01);
- u_int16_t hdrSize;
-
- hdrSize = 56;
-
- if (hasCrc) {
- hdrSize += 16;
- }
- return hdrSize;
-}
-
-extern "C" u_int16_t MP4AV_AdtsGetHeaderByteSize(u_int8_t* pHdr)
-{
- return (MP4AV_AdtsGetHeaderBitSize(pHdr) + 7) / 8;
-}
-
-extern "C" u_int8_t MP4AV_AdtsGetVersion(u_int8_t* pHdr)
-{
- return (pHdr[1] & 0x08) >> 3;
-}
-
-extern "C" u_int8_t MP4AV_AdtsGetProfile(u_int8_t* pHdr)
-{
- return (pHdr[2] & 0xc0) >> 6;
-}
-
-extern "C" u_int8_t MP4AV_AdtsGetSamplingRateIndex(u_int8_t* pHdr)
-{
- return (pHdr[2] & 0x3c) >> 2;
-}
-
-extern "C" u_int8_t MP4AV_AdtsFindSamplingRateIndex(u_int32_t samplingRate)
-{
- for (u_int8_t i = 0; i < NUM_ADTS_SAMPLING_RATES; i++) {
- if (samplingRate == AdtsSamplingRates[i]) {
- return i;
- }
- }
- return NUM_ADTS_SAMPLING_RATES - 1;
-}
-
-extern "C" u_int32_t MP4AV_AdtsGetSamplingRate(u_int8_t* pHdr)
-{
- return AdtsSamplingRates[MP4AV_AdtsGetSamplingRateIndex(pHdr)];
-}
-
-extern "C" u_int8_t MP4AV_AdtsGetChannels(u_int8_t* pHdr)
-{
- return ((pHdr[2] & 0x1) << 2) | ((pHdr[3] & 0xc0) >> 6);
-}
-
-extern "C" bool MP4AV_AdtsMakeFrameFromMp4Sample(
- MP4FileHandle mp4File,
- MP4TrackId trackId,
- MP4SampleId sampleId,
- int force_profile,
- u_int8_t** ppAdtsData,
- u_int32_t* pAdtsDataLength)
-{
- static MP4FileHandle lastMp4File = MP4_INVALID_FILE_HANDLE;
- static MP4TrackId lastMp4TrackId = MP4_INVALID_TRACK_ID;
- static bool isMpeg2;
- static u_int8_t profile;
- static u_int32_t samplingFrequency;
- static u_int8_t channels;
-
- if (mp4File != lastMp4File || trackId != lastMp4TrackId) {
-
- // changed cached file and track info
-
- lastMp4File = mp4File;
- lastMp4TrackId = trackId;
-
- u_int8_t audioType = MP4GetTrackEsdsObjectTypeId(mp4File,
- trackId);
-
- if (MP4_IS_MPEG2_AAC_AUDIO_TYPE(audioType)) {
- isMpeg2 = true;
- profile = audioType - MP4_MPEG2_AAC_MAIN_AUDIO_TYPE;
- if (force_profile == 4) {
- isMpeg2 = false;
- // profile remains the same
- }
- } else if (audioType == MP4_MPEG4_AUDIO_TYPE) {
- isMpeg2 = false;
- profile = MP4GetTrackAudioMpeg4Type(mp4File, trackId) - 1;
- if (force_profile == 2) {
- if (profile > MP4_MPEG4_AAC_SSR_AUDIO_TYPE) {
- // they can't use these profiles for mpeg2.
- lastMp4File = MP4_INVALID_FILE_HANDLE;
- lastMp4TrackId =MP4_INVALID_TRACK_ID;
- return false;
- }
- isMpeg2 = true;
- }
- } else {
- lastMp4File = MP4_INVALID_FILE_HANDLE;
- lastMp4TrackId = MP4_INVALID_TRACK_ID;
- return false;
- }
-
- u_int8_t* pConfig = NULL;
- u_int32_t configLength;
-
- MP4GetTrackESConfiguration(
- mp4File,
- trackId,
- &pConfig,
- &configLength);
-
- if (pConfig == NULL || configLength < 2) {
- lastMp4File = MP4_INVALID_FILE_HANDLE;
- lastMp4TrackId = MP4_INVALID_TRACK_ID;
- return false;
- }
-
- samplingFrequency = MP4AV_AacConfigGetSamplingRate(pConfig);
-
- channels = MP4AV_AacConfigGetChannels(pConfig);
-
- }
-
- bool rc;
- u_int8_t* pSample = NULL;
- u_int32_t sampleSize = 0;
-
- rc = MP4ReadSample(
- mp4File,
- trackId,
- sampleId,
- &pSample,
- &sampleSize);
-
- if (!rc) {
- return false;
- }
-
- rc = MP4AV_AdtsMakeFrame(
- pSample,
- sampleSize,
- isMpeg2,
- profile,
- samplingFrequency,
- channels,
- ppAdtsData,
- pAdtsDataLength);
-
- free(pSample);
-
- return rc;
-}
-
-extern "C" bool MP4AV_AdtsMakeFrame(
- u_int8_t* pData,
- u_int16_t dataLength,
- bool isMpeg2,
- u_int8_t profile,
- u_int32_t samplingFrequency,
- u_int8_t channels,
- u_int8_t** ppAdtsData,
- u_int32_t* pAdtsDataLength)
-{
- *pAdtsDataLength = 7 + dataLength; // 56 bits only
-
- CMemoryBitstream adts;
-
- try {
- adts.AllocBytes(*pAdtsDataLength);
- *ppAdtsData = adts.GetBuffer();
-
- // build adts header
- adts.PutBits(0xFFF, 12); // syncword
- adts.PutBits(isMpeg2, 1); // id
- adts.PutBits(0, 2); // layer
- adts.PutBits(1, 1); // protection_absent
- adts.PutBits(profile, 2); // profile
- adts.PutBits(
- MP4AV_AdtsFindSamplingRateIndex(samplingFrequency),
- 4); // sampling_frequency_index
- adts.PutBits(0, 1); // private
- adts.PutBits(channels, 3); // channel_configuration
- adts.PutBits(0, 1); // original
- adts.PutBits(0, 1); // home
-
- adts.PutBits(0, 1); // copyright_id
- adts.PutBits(0, 1); // copyright_id_start
- adts.PutBits(*pAdtsDataLength, 13); // aac_frame_length
- adts.PutBits(0x7FF, 11); // adts_buffer_fullness
- adts.PutBits(0, 2); // num_raw_data_blocks
-
- // copy audio frame data
- adts.PutBytes(pData, dataLength);
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
--- a/common/mp4av/audio.cpp
+++ /dev/null
@@ -1,212 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-static MP4AV_Mp3Header GetMp3Header(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId)
-{
- u_int8_t* pMp3Frame = NULL;
- u_int32_t mp3FrameLength = 0;
-
- bool rc = MP4ReadSample(
- mp4File,
- audioTrackId,
- 1,
- &pMp3Frame,
- &mp3FrameLength);
-
- if (!rc || mp3FrameLength < 4) {
- return 0;
- }
-
- MP4AV_Mp3Header mp3Hdr =
- MP4AV_Mp3HeaderFromBytes(pMp3Frame);
- free(pMp3Frame);
-
- return mp3Hdr;
-}
-
-extern "C" u_int8_t MP4AV_AudioGetChannels(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId)
-{
- u_int8_t audioType =
- MP4GetTrackEsdsObjectTypeId(mp4File, audioTrackId);
-
- if (audioType == MP4_INVALID_AUDIO_TYPE) {
- return 0;
- }
-
- if (MP4_IS_MP3_AUDIO_TYPE(audioType)) {
- MP4AV_Mp3Header mp3Hdr =
- GetMp3Header(mp4File, audioTrackId);
-
- if (mp3Hdr == 0) {
- return 0;
- }
- return MP4AV_Mp3GetChannels(mp3Hdr);
-
- } else if (MP4_IS_AAC_AUDIO_TYPE(audioType)) {
- u_int8_t* pAacConfig = NULL;
- u_int32_t aacConfigLength;
-
- MP4GetTrackESConfiguration(
- mp4File,
- audioTrackId,
- &pAacConfig,
- &aacConfigLength);
-
- if (pAacConfig == NULL || aacConfigLength < 2) {
- return 0;
- }
-
- u_int8_t channels =
- MP4AV_AacConfigGetChannels(pAacConfig);
-
- free(pAacConfig);
-
- return channels;
-
- } else if ((audioType == MP4_PCM16_LITTLE_ENDIAN_AUDIO_TYPE) ||
- (audioType == MP4_PCM16_BIG_ENDIAN_AUDIO_TYPE)) {
- u_int32_t samplesPerFrame =
- MP4GetSampleSize(mp4File, audioTrackId, 1) / 2;
-
- MP4Duration frameDuration =
- MP4GetSampleDuration(mp4File, audioTrackId, 1);
-
- if (frameDuration == 0) {
- return 0;
- }
-
- // assumes track time scale == sampling rate
- return samplesPerFrame / frameDuration;
- }
-
- return 0;
-}
-
-extern "C" u_int32_t MP4AV_AudioGetSamplingRate(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId)
-{
- u_int8_t audioType =
- MP4GetTrackEsdsObjectTypeId(mp4File, audioTrackId);
-
- if (audioType == MP4_INVALID_AUDIO_TYPE) {
- return 0;
- }
-
- if (MP4_IS_MP3_AUDIO_TYPE(audioType)) {
- MP4AV_Mp3Header mp3Hdr =
- GetMp3Header(mp4File, audioTrackId);
-
- if (mp3Hdr == 0) {
- return 0;
- }
- return MP4AV_Mp3GetHdrSamplingRate(mp3Hdr);
-
- } else if (MP4_IS_AAC_AUDIO_TYPE(audioType)) {
- u_int8_t* pAacConfig = NULL;
- u_int32_t aacConfigLength;
-
- MP4GetTrackESConfiguration(
- mp4File,
- audioTrackId,
- &pAacConfig,
- &aacConfigLength);
-
- if (pAacConfig == NULL || aacConfigLength < 2) {
- return 0;
- }
-
- u_int32_t samplingRate =
- MP4AV_AacConfigGetSamplingRate(pAacConfig);
-
- free(pAacConfig);
-
- return samplingRate;
-
- } else if ((audioType == MP4_PCM16_LITTLE_ENDIAN_AUDIO_TYPE)||
- (audioType == MP4_PCM16_BIG_ENDIAN_AUDIO_TYPE)) {
- return MP4GetTrackTimeScale(mp4File, audioTrackId);
- }
-
- return 0;
-}
-
-extern "C" u_int16_t MP4AV_AudioGetSamplingWindow(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId)
-{
- u_int8_t audioType =
- MP4GetTrackEsdsObjectTypeId(mp4File, audioTrackId);
-
- if (audioType == MP4_INVALID_AUDIO_TYPE) {
- return 0;
- }
-
- if (MP4_IS_MP3_AUDIO_TYPE(audioType)) {
- MP4AV_Mp3Header mp3Hdr =
- GetMp3Header(mp4File, audioTrackId);
-
- return MP4AV_Mp3GetHdrSamplingWindow(mp3Hdr);
-
- } else if (MP4_IS_AAC_AUDIO_TYPE(audioType)) {
- u_int8_t* pAacConfig = NULL;
- u_int32_t aacConfigLength;
-
- MP4GetTrackESConfiguration(
- mp4File,
- audioTrackId,
- &pAacConfig,
- &aacConfigLength);
-
- if (pAacConfig == NULL || aacConfigLength < 2) {
- return 0;
- }
-
- u_int32_t samplingWindow =
- MP4AV_AacConfigGetSamplingWindow(pAacConfig);
-
- free(pAacConfig);
-
- return samplingWindow;
-
- } else if ((audioType == MP4_PCM16_LITTLE_ENDIAN_AUDIO_TYPE)||
- (audioType == MP4_PCM16_BIG_ENDIAN_AUDIO_TYPE)) {
- MP4Duration frameDuration =
- MP4GetSampleDuration(mp4File, audioTrackId, 1);
-
- // assumes track time scale == sampling rate
- // and constant frame size was used
- return frameDuration;
- }
-
- return 0;
-}
--- a/common/mp4av/audio_hinters.cpp
+++ /dev/null
@@ -1,218 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-bool MP4AV_AudioConsecutiveHinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4Duration sampleDuration,
- u_int8_t perPacketHeaderSize,
- u_int8_t perSampleHeaderSize,
- u_int8_t maxSamplesPerPacket,
- u_int16_t maxPayloadSize,
- MP4AV_AudioSampleSizer pSizer,
- MP4AV_AudioConcatenator pConcatenator,
- MP4AV_AudioFragmenter pFragmenter)
-{
- bool rc;
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- u_int16_t bytesThisHint = perPacketHeaderSize;
- u_int16_t samplesThisHint = 0;
- MP4SampleId* pSampleIds =
- new MP4SampleId[maxSamplesPerPacket];
-
- for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
-
- u_int32_t sampleSize =
- (*pSizer)(mp4File, mediaTrackId, sampleId);
-
- // sample won't fit in this packet
- // or we've reached the limit on samples per packet
- if ((int16_t)(sampleSize + perSampleHeaderSize)
- > maxPayloadSize - bytesThisHint
- || samplesThisHint == maxSamplesPerPacket) {
-
- if (samplesThisHint > 0) {
- rc = (*pConcatenator)(mp4File, mediaTrackId, hintTrackId,
- samplesThisHint, pSampleIds,
- samplesThisHint * sampleDuration,
- maxPayloadSize);
-
- if (!rc) {
- return false;
- }
- }
-
- // start a new hint
- samplesThisHint = 0;
- bytesThisHint = perPacketHeaderSize;
-
- // fall thru
- }
-
- // sample is less than remaining payload size
- if ((int16_t)(sampleSize + perSampleHeaderSize)
- <= maxPayloadSize - bytesThisHint) {
-
- // add it to this hint
- bytesThisHint += (sampleSize + perSampleHeaderSize);
- pSampleIds[samplesThisHint++] = sampleId;
-
- } else {
- // jumbo frame, need to fragment it
- rc = (*pFragmenter)(mp4File, mediaTrackId, hintTrackId,
- sampleId, sampleSize, sampleDuration, maxPayloadSize);
-
- if (!rc) {
- return false;
- }
-
- // start a new hint
- samplesThisHint = 0;
- bytesThisHint = perPacketHeaderSize;
- }
- }
-
- if (samplesThisHint > 0) {
- rc = (*pConcatenator)(mp4File, mediaTrackId, hintTrackId,
- samplesThisHint, pSampleIds,
- samplesThisHint * sampleDuration,
- maxPayloadSize);
-
- if (!rc) {
- return false;
- }
- }
-
- delete [] pSampleIds;
-
- return true;
-}
-
-bool MP4AV_AudioInterleaveHinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4Duration sampleDuration,
- u_int8_t stride,
- u_int8_t bundle,
- u_int16_t maxPayloadSize,
- MP4AV_AudioConcatenator pConcatenator)
-{
- bool rc;
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- MP4SampleId* pSampleIds = new MP4SampleId[bundle];
-
- uint32_t sampleIds = 0;
- for (u_int32_t i = 1; i <= numSamples; i += stride * bundle) {
- for (u_int32_t j = 0; j < stride; j++) {
- u_int32_t k;
- for (k = 0; k < bundle; k++) {
-
- MP4SampleId sampleId = i + j + (k * stride);
-
- // out of samples for this bundle
- if (sampleId > numSamples) {
- break;
- }
-
- // add sample to this hint
- pSampleIds[k] = sampleId;
- sampleIds++;
- }
-
- if (k == 0) {
- break;
- }
-
- // compute hint duration
- // note this is used to control the RTP timestamps
- // that are emitted for the packet,
- // it isn't the actual duration of the samples in the packet
- MP4Duration hintDuration;
- if (j + 1 == stride) {
- // at the end of the track
- if (i + (stride * bundle) > numSamples) {
- hintDuration = ((numSamples - i) - j) * sampleDuration;
- if (hintDuration == 0) {
- hintDuration = sampleDuration;
- }
- } else {
- hintDuration = ((stride * bundle) - j) * sampleDuration;
- }
- } else {
- hintDuration = sampleDuration;
- }
-
- // write hint
- rc = (*pConcatenator)(mp4File, mediaTrackId, hintTrackId,
- k, pSampleIds, hintDuration, maxPayloadSize);
- sampleIds = 0;
-
- if (!rc) {
- return false;
- }
- }
- }
-
- delete [] pSampleIds;
-
- return true;
-}
-
-MP4Duration MP4AV_GetAudioSampleDuration(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId)
-{
- MP4SampleId sampleId = 1;
- MP4SampleId numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- // find first non-zero size sample
- // we need to search in case an empty audio sample has been added
- // at the beginning of the track to achieve sync with video
- for (; sampleId <= numSamples; sampleId++) {
- if (MP4GetSampleSize(mp4File, mediaTrackId, sampleId) > 0) {
- break;
- }
- }
- if (sampleId >= numSamples) {
- return MP4_INVALID_DURATION;
- }
-
- // get sample duration
- return MP4GetSampleDuration(mp4File, mediaTrackId, sampleId);
-
- // OPTION may want to scan all non-zero sized samples
- // and check that sample durations are +/-1 the same value
-}
-
--- a/common/mp4av/audio_hinters.h
+++ /dev/null
@@ -1,78 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __AUDIO_HINTERS_INCLUDED__
-#define __AUDIO_HINTERS_INCLUDED__
-
-// Generic Audio Hinters
-
-typedef u_int32_t (*MP4AV_AudioSampleSizer)(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4SampleId sampleId);
-
-typedef bool (*MP4AV_AudioConcatenator)(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- u_int8_t samplesThisHint,
- MP4SampleId* pSampleIds,
- MP4Duration hintDuration,
- u_int16_t maxPayloadSize);
-
-typedef bool (*MP4AV_AudioFragmenter)(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- u_int32_t sampleSize,
- MP4Duration sampleDuration,
- u_int16_t maxPayloadSize);
-
-bool MP4AV_AudioConsecutiveHinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4Duration sampleDuration,
- u_int8_t perPacketHeaderSize,
- u_int8_t perSampleHeaderSize,
- u_int8_t maxSamplesPerPacket,
- u_int16_t maxPayloadSize,
- MP4AV_AudioSampleSizer pSizer,
- MP4AV_AudioConcatenator pConcatenator,
- MP4AV_AudioFragmenter pFragmenter);
-
-bool MP4AV_AudioInterleaveHinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4Duration sampleDuration,
- u_int8_t stride,
- u_int8_t bundle,
- u_int16_t maxPayloadSize,
- MP4AV_AudioConcatenator pConcatenator);
-
-MP4Duration MP4AV_GetAudioSampleDuration(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId);
-
-#endif /* __AUDIO_HINTERS_INCLUDED__ */
-
--- a/common/mp4av/l16.cpp
+++ /dev/null
@@ -1,167 +1,0 @@
-/*
- * 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. 2002. All Rights Reserved.
- *
- * Contributor(s):
- * Bill May wmay@cisco.com
- */
-
-#include <mp4av_common.h>
-
-#define DEBUG_L16 1
-extern "C" bool L16Hinter (MP4FileHandle mp4file,
- MP4TrackId trackid,
- uint16_t maxPayloadSize)
-{
- uint32_t numSamples;
- uint8_t audioType;
- MP4SampleId sampleId;
- uint32_t sampleSize;
- MP4Duration duration;
- char buffer[40];
- MP4TrackId hintTrackId;
- uint8_t payload;
- int chans;
- uint32_t bytes_this_hint;
- uint32_t sampleOffset;
-
-#ifdef DEBUG_L16
- printf("time scale %u\n", MP4GetTrackTimeScale(mp4file, trackid));
-
- printf("Track fixed sample %llu\n", MP4GetTrackFixedSampleDuration(mp4file, trackid));
-#endif
-
- numSamples = MP4GetTrackNumberOfSamples(mp4file, trackid);
-
- if (numSamples == 0) return false;
-
-
-#ifdef DEBUG_L16
- for (unsigned int ix = 1; ix < MIN(10, numSamples); ix++) {
- printf("sampleId %d, size %u duration %llu time %llu\n",
- ix, MP4GetSampleSize(mp4file, trackid, ix),
- MP4GetSampleDuration(mp4file, trackid, ix),
- MP4GetSampleTime(mp4file, trackid, ix));
- }
-#endif
-
- audioType = MP4GetTrackEsdsObjectTypeId(mp4file, trackid);
-
- if (audioType != MP4_PCM16_BIG_ENDIAN_AUDIO_TYPE) return false;
-
- sampleId = 1;
- while ((sampleSize = MP4GetSampleSize(mp4file, trackid, sampleId)) == 0) {
- if (sampleId >= numSamples) return false;
- sampleId++;
- }
-
- // we have a sampleID with a size. Give me duration, and we know the
- // number of channels based on the sample size for that duration
- duration = MP4GetSampleDuration(mp4file, trackid, sampleId);
-
- sampleSize /= sizeof(uint16_t);
-
- if ((sampleSize % duration) != 0) {
-#ifdef DEBUG_L16
- printf("Number of samples not correct - duration %llu sample %d\n",
- duration, sampleSize);
-#endif
- return false;
- }
-
- chans = sampleSize / duration;
- snprintf(buffer, sizeof(buffer), "%d", chans);
-
- hintTrackId = MP4AddHintTrack(mp4file, trackid);
-
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- return false;
- }
-
- payload = MP4_SET_DYNAMIC_PAYLOAD;
- if (MP4GetTrackTimeScale(mp4file, trackid) == 44100) {
- if (chans == 1) payload = 11;
- else if (chans == 2) payload = 10;
- }
- MP4SetHintTrackRtpPayload(mp4file, hintTrackId, "L16", &payload, 0,
- chans == 1 ? NULL : buffer);
-
- sampleId = 1;
- sampleSize = MP4GetSampleSize(mp4file, trackid, sampleId);
- sampleOffset = 0;
- bytes_this_hint = 0;
-
- if (maxPayloadSize & 0x1) maxPayloadSize--;
-
- while (1) {
- if (bytes_this_hint == 0) {
-#ifdef DEBUG_L16
- printf("Adding hint/packet\n");
-#endif
- MP4AddRtpHint(mp4file, hintTrackId);
- MP4AddRtpPacket(mp4file, hintTrackId, false); // marker bit 0
- }
- uint16_t bytes_left_this_packet;
- bytes_left_this_packet = maxPayloadSize - bytes_this_hint;
- if (sampleSize >= bytes_left_this_packet) {
- MP4AddRtpSampleData(mp4file, hintTrackId,
- sampleId, sampleOffset, bytes_left_this_packet);
- bytes_this_hint += bytes_left_this_packet;
- sampleSize -= bytes_left_this_packet;
- sampleOffset += bytes_left_this_packet;
-#ifdef DEBUG_L16
- printf("Added sample with %d bytes\n", bytes_left_this_packet);
-#endif
- } else {
- MP4AddRtpSampleData(mp4file, hintTrackId,
- sampleId, sampleOffset, sampleSize);
- bytes_this_hint += sampleSize;
-#ifdef DEBUG_L16
- printf("Added sample with %d bytes\n", sampleSize);
-#endif
- sampleSize = 0;
- }
-
- if (bytes_this_hint >= maxPayloadSize) {
- // Write the hint
- // duration is 1/2 of the bytes written
- MP4WriteRtpHint(mp4file, hintTrackId, bytes_this_hint / (2 * chans));
-#ifdef DEBUG_L16
- printf("Finished packet - bytes %d\n", bytes_this_hint);
-#endif
- bytes_this_hint = 0;
- }
- if (sampleSize == 0) {
- // next sample
- sampleId++;
- if (sampleId > numSamples) {
- // finish it and exit
- if (bytes_this_hint != 0) {
- MP4WriteRtpHint(mp4file, hintTrackId, bytes_this_hint / 2);
- return true;
- }
- }
- sampleSize = MP4GetSampleSize(mp4file, trackid, sampleId);
-#ifdef DEBUG_L16
- printf("Next sample %d - size %d\n", sampleId, sampleSize);
-#endif
- sampleOffset = 0;
- }
- }
-
- return true; // will never reach here
-}
-
--- a/common/mp4av/libmp4av.dsp
+++ /dev/null
@@ -1,184 +1,0 @@
-# Microsoft Developer Studio Project File - Name="libmp4av" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=libmp4av - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "libmp4av.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "libmp4av.mak" CFG="libmp4av - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "libmp4av - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "libmp4av - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "libmp4av - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "libmp4av___Win32_Release"
-# PROP BASE Intermediate_Dir "libmp4av___Win32_Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "MRelease"
-# PROP Intermediate_Dir "MRelease"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "..\mp4v2" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "libmp4av - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "MDebug"
-# PROP Intermediate_Dir "MDebug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I "..\mp4v2" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "_WIN32" /D "_WINDOWS" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "libmp4av - Win32 Release"
-# Name "libmp4av - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\aac.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\adts.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\audio.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\audio_hinters.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mbs.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp3.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mpeg3.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mpeg4.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfc2250.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfc3016.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfc3119.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfcisma.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\audio_hinters.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mbs.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_aac.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_adts.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_audio.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_common.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_hinters.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_mp3.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_mpeg3.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_mpeg4.h
-# End Source File
-# End Group
-# End Target
-# End Project
--- a/common/mp4av/libmp4av_st.dsp
+++ /dev/null
@@ -1,180 +1,0 @@
-# Microsoft Developer Studio Project File - Name="libmp4av_st" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=libmp4av_st - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "libmp4av_st.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "libmp4av_st.mak" CFG="libmp4av_st - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "libmp4av_st - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "libmp4av_st - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "libmp4av_st - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-F90=df.exe
-MTL=midl.exe
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O1 /I "..\mp4v2" /I "." /I "..\..\include" /I "..\..\lib\mp4v2" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "libmp4av_st - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-F90=df.exe
-MTL=midl.exe
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\mp4v2" /I "." /I "..\..\include" /I "..\..\lib\mp4v2" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "libmp4av_st - Win32 Release"
-# Name "libmp4av_st - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\aac.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\adts.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\audio_hinters.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\l16.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mbs.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp3.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mpeg3.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\mpeg4.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfc2250.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfc3016.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfc3119.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\rfcisma.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\audio_hinters.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mbs.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_aac.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_adts.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_common.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_hinters.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_mp3.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\mp4av_mpeg4.h
-# End Source File
-# End Group
-# End Target
-# End Project
--- a/common/mp4av/libmp4av_st.vcproj
+++ /dev/null
@@ -1,199 +1,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="libmp4av_st"
- ProjectGUID="{8CAC9E26-BAA5-45A4-8721-E3170B3F8F49}"
- SccProjectName=""
- SccLocalPath="">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\Release"
- IntermediateDirectory=".\Release"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="1"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\mp4v2,.\"
- PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile=".\Release/libmp4av_st.pch"
- AssemblerListingLocation=".\Release/"
- ObjectFile=".\Release/"
- ProgramDataBaseFileName=".\Release/"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- CompileAs="0">
- <IntelOptions
- Optimization="1"
- InlineFunctionExpansion="1"
- OmitFramePointers="1"
- StringPooling="1"
- RuntimeLibrary="2"
- BufferSecurityCheck="1"
- EnableFunctionLevelLinking="1"
- AllOptions="/c /I "..\mp4v2" /I ".\\" /nologo /W3 /O1 /Ob1 /Oy /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_MBCS" /GF /FD /EHsc /MD /GS /Gy /YX"StdAfx.h" /Fp".\Release/libmp4av_st.pch" /Fo".\Release/" /Fd".\Release/" /Gd"/>
- </Tool>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\Release\libmp4av_st.lib"
- SuppressStartupBanner="TRUE">
- <IntelOptions
- AllOptions="/OUT:".\Release\libmp4av_st.lib" /NOLOGO"/>
- </Tool>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- <IntelOptions
- CompilerName="1"/>
- </Configuration>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\Debug"
- IntermediateDirectory=".\Debug"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\mp4v2,.\"
- PreprocessorDefinitions="WIN32,_DEBUG,_LIB"
- BasicRuntimeChecks="0"
- RuntimeLibrary="1"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile=".\Debug/libmp4av_st.pch"
- AssemblerListingLocation=".\Debug/"
- ObjectFile=".\Debug/"
- ProgramDataBaseFileName=".\Debug/"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="4"
- CompileAs="0">
- <IntelOptions
- Optimization="0"
- MinimalRebuild="1"
- BasicRuntimeChecks="0"
- RuntimeLibrary="1"
- AllOptions="/c /I "..\mp4v2" /I ".\\" /ZI /nologo /W3 /Od /D "WIN32" /D "_DEBUG" /D "_LIB" /D "_MBCS" /Gm /EHsc /MTd /YX"StdAfx.h" /Fp".\Debug/libmp4av_st.pch" /Fo".\Debug/" /Fd".\Debug/" /Gd"/>
- </Tool>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\Debug\libmp4av_st.lib"
- SuppressStartupBanner="TRUE">
- <IntelOptions
- AllOptions="/OUT:".\Debug\libmp4av_st.lib" /NOLOGO"/>
- </Tool>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- <IntelOptions
- CompilerName="1"/>
- </Configuration>
- </Configurations>
- <References/>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
- <File
- RelativePath=".\aac.cpp"/>
- <File
- RelativePath=".\adts.cpp"/>
- <File
- RelativePath=".\audio_hinters.cpp"/>
- <File
- RelativePath=".\l16.cpp"/>
- <File
- RelativePath=".\mbs.cpp"/>
- <File
- RelativePath=".\mp3.cpp"/>
- <File
- RelativePath=".\mpeg3.cpp"/>
- <File
- RelativePath=".\mpeg4.cpp"/>
- <File
- RelativePath=".\rfc2250.cpp"/>
- <File
- RelativePath=".\rfc3016.cpp"/>
- <File
- RelativePath=".\rfc3119.cpp"/>
- <File
- RelativePath=".\rfcisma.cpp"/>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl">
- <File
- RelativePath=".\audio_hinters.h"/>
- <File
- RelativePath=".\mbs.h"/>
- <File
- RelativePath=".\mp4av.h"/>
- <File
- RelativePath=".\mp4av_aac.h"/>
- <File
- RelativePath=".\mp4av_adts.h"/>
- <File
- RelativePath=".\mp4av_common.h"/>
- <File
- RelativePath=".\mp4av_hinters.h"/>
- <File
- RelativePath=".\mp4av_mp3.h"/>
- <File
- RelativePath=".\mp4av_mpeg4.h"/>
- </Filter>
- </Files>
- <Globals/>
-</VisualStudioProject>
--- a/common/mp4av/mbs.cpp
+++ /dev/null
@@ -1,93 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#include "mp4av_common.h"
-
-void CMemoryBitstream::AllocBytes(u_int32_t numBytes)
-{
- m_pBuf = (u_int8_t*)calloc(numBytes, 1);
- if (!m_pBuf) {
- throw ENOMEM;
- }
- m_bitPos = 0;
- m_numBits = numBytes << 3;
-}
-
-void CMemoryBitstream::SetBytes(u_int8_t* pBytes, u_int32_t numBytes)
-{
- m_pBuf = pBytes;
- m_bitPos = 0;
- m_numBits = numBytes << 3;
-}
-
-void CMemoryBitstream::PutBytes(u_int8_t* pBytes, u_int32_t numBytes)
-{
- u_int32_t numBits = numBytes << 3;
-
- if (numBits + m_bitPos > m_numBits) {
- throw EIO;
- }
-
- if ((m_bitPos & 7) == 0) {
- memcpy(&m_pBuf[m_bitPos >> 3], pBytes, numBytes);
- m_bitPos += numBits;
- } else {
- for (u_int32_t i = 0; i < numBytes; i++) {
- PutBits(pBytes[i], 8);
- }
- }
-}
-
-void CMemoryBitstream::PutBits(u_int32_t bits, u_int32_t numBits)
-{
- if (numBits + m_bitPos > m_numBits) {
- throw EIO;
- }
- if (numBits > 32) {
- throw EIO;
- }
-
- for (int8_t i = numBits - 1; i >= 0; i--) {
- m_pBuf[m_bitPos >> 3] |= ((bits >> i) & 1) << (7 - (m_bitPos & 7));
- m_bitPos++;
- }
-}
-
-u_int32_t CMemoryBitstream::GetBits(u_int32_t numBits)
-{
- if (numBits + m_bitPos > m_numBits) {
- throw EIO;
- }
- if (numBits > 32) {
- throw EIO;
- }
-
- u_int32_t bits = 0;
-
- for (u_int8_t i = 0; i < numBits; i++) {
- bits <<= 1;
- bits |= (m_pBuf[m_bitPos >> 3] >> (7 - (m_bitPos & 7))) & 1;
- m_bitPos++;
- }
-
- return bits;
-}
-
--- a/common/mp4av/mbs.h
+++ /dev/null
@@ -1,81 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MBS_INCLUDED__
-#define __MBS_INCLUDED__
-
-class CMemoryBitstream {
-public:
- CMemoryBitstream() {
- m_pBuf = NULL;
- m_bitPos = 0;
- m_numBits = 0;
- }
-
- void AllocBytes(u_int32_t numBytes);
-
- void SetBytes(u_int8_t* pBytes, u_int32_t numBytes);
-
- void PutBytes(u_int8_t* pBytes, u_int32_t numBytes);
-
- void PutBits(u_int32_t bits, u_int32_t numBits);
-
- u_int32_t GetBits(u_int32_t numBits);
-
- void SkipBytes(u_int32_t numBytes) {
- SkipBits(numBytes << 3);
- }
-
- void SkipBits(u_int32_t numBits) {
- SetBitPosition(GetBitPosition() + numBits);
- }
-
- u_int32_t GetBitPosition() {
- return m_bitPos;
- }
-
- void SetBitPosition(u_int32_t bitPos) {
- if (bitPos > m_numBits) {
- throw;
- }
- m_bitPos = bitPos;
- }
-
- u_int8_t* GetBuffer() {
- return m_pBuf;
- }
-
- u_int32_t GetNumberOfBytes() {
- return (GetNumberOfBits() + 7) / 8;
- }
-
- u_int32_t GetNumberOfBits() {
- return m_numBits;
- }
-
-protected:
- u_int8_t* m_pBuf;
- u_int32_t m_bitPos;
- u_int32_t m_numBits;
-};
-
-#endif /* __MBS_INCLUDED__ */
-
--- a/common/mp4av/mp3.cpp
+++ /dev/null
@@ -1,350 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-static u_int16_t Mp3BitRates[5][14] = {
- /* MPEG-1, Layer III */
- { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 },
- /* MPEG-1, Layer II */
- { 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 },
- /* MPEG-1, Layer I */
- { 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 },
- /* MPEG-2 or 2.5, Layer II or III */
- { 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 },
- /* MPEG-2 or 2.5, Layer I */
- { 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256 }
-};
-
-static u_int16_t Mp3SampleRates[4][3] = {
- { 11025, 12000, 8000 }, /* MPEG-2.5 */
- { 0, 0, 0 },
- { 22050, 24000, 16000 }, /* MPEG-2 */
- { 44100, 48000, 32000 } /* MPEG-1 */
-};
-
-extern "C" bool MP4AV_Mp3GetNextFrame(
- const u_int8_t* pSrc,
- u_int32_t srcLength,
- const u_int8_t** ppFrame,
- u_int32_t* pFrameSize,
- bool allowLayer4,
- bool donthack)
-{
- u_int state = 0;
- u_int dropped = 0;
- u_char bytes[4];
- u_int32_t srcPos = 0;
-
- while (true) {
- /* read a byte */
- if (srcPos >= srcLength) {
- return false;
- }
- u_char b = pSrc[srcPos++];
-
- if (state == 3) {
- bytes[state] = b;
- *ppFrame = pSrc + dropped;
- u_int32_t header = (bytes[0] << 24) | (bytes[1] << 16)
- | (bytes[2] << 8) | bytes[3];
- *pFrameSize = MP4AV_Mp3GetFrameSize(header);
- return true;
- }
- if (state == 2) {
- if ((b & 0xF0) == 0 || (b & 0xF0) == 0xF0 || (b & 0x0C) == 0x0C) {
- if (bytes[1] == 0xFF) {
- state = 1;
- } else {
- state = 0;
- }
- } else {
- bytes[state] = b;
- state = 3;
- }
- }
- if (state == 1) {
- if ((b & 0xE0) == 0xE0 && (b & 0x18) != 0x08 &&
- ((b & 0x06) != 0 || allowLayer4)) {
- bytes[state] = b;
- state = 2;
- } else {
- state = 0;
- }
- }
- if (state == 0) {
- if (b == 0xFF) {
- bytes[state] = b;
- state = 1;
- } else {
- if (donthack == FALSE &&
- (dropped == 0 &&
- ((b & 0xE0) == 0xE0 &&
- (b & 0x18) != 0x08 &&
- ((b & 0x06) != 0 || allowLayer4)))) {
- /*
- * HACK have seen files where previous frame
- * was marked as padded, but the byte was never added
- * which results in the next frame's leading 0XFF being
- * eaten. We attempt to repair that situation here.
- */
- bytes[0] = 0xFF;
- bytes[1] = b;
- state = 2;
- } else {
- /* else drop it */
- dropped++;
- }
- }
- }
- }
-}
-
-extern "C" MP4AV_Mp3Header MP4AV_Mp3HeaderFromBytes(const u_int8_t* pBytes)
-{
- return (pBytes[0] << 24) | (pBytes[1] << 16)
- | (pBytes[2] << 8) | pBytes[3];
-}
-
-// MP3 Header
-// syncword 11 bits
-// version 2 bits
-// layer 2 bits
-// protection 1 bit
-// bitrate_index 4 bits
-// sampling_rate 2 bits
-// padding 1 bit
-// private 1 bit
-// mode 2 bits
-// mode_ext 2 bits
-// copyright 1 bit
-// original 1 bit
-// emphasis 2 bits
-
-extern "C" u_int8_t MP4AV_Mp3GetHdrVersion(MP4AV_Mp3Header hdr)
-{
- /* extract the necessary field from the MP3 header */
- return ((hdr >> 19) & 0x3);
-}
-
-extern "C" u_int8_t MP4AV_Mp3GetHdrLayer(MP4AV_Mp3Header hdr)
-{
- /* extract the necessary field from the MP3 header */
- return ((hdr >> 17) & 0x3);
-}
-
-extern "C" u_int8_t MP4AV_Mp3GetChannels(MP4AV_Mp3Header hdr)
-{
- if (((hdr >> 6) & 0x3) == 3) {
- return 1;
- }
- return 2;
-}
-
-extern "C" u_int16_t MP4AV_Mp3GetHdrSamplingRate(MP4AV_Mp3Header hdr)
-{
- /* extract the necessary fields from the MP3 header */
- u_int8_t version = MP4AV_Mp3GetHdrVersion(hdr);
- u_int8_t sampleRateIndex = (hdr >> 10) & 0x3;
-
- return Mp3SampleRates[version][sampleRateIndex];
-}
-
-extern "C" u_int16_t MP4AV_Mp3GetHdrSamplingWindow(MP4AV_Mp3Header hdr)
-{
- u_int8_t version = MP4AV_Mp3GetHdrVersion(hdr);
- u_int8_t layer = MP4AV_Mp3GetHdrLayer(hdr);
- u_int16_t samplingWindow;
-
- if (layer == 1) {
- if (version == 3) {
- samplingWindow = 1152;
- } else {
- samplingWindow = 576;
- }
- } else if (layer == 2) {
- samplingWindow = 1152;
- } else {
- samplingWindow = 384;
- }
-
- return samplingWindow;
-}
-
-extern "C" u_int16_t MP4AV_Mp3GetSamplingWindow(u_int16_t samplingRate)
-{
- // assumes MP3 usage
- if (samplingRate > 24000) {
- return 1152;
- }
- return 576;
-}
-
-extern "C" u_int16_t MP4AV_Mp3GetBitRate (MP4AV_Mp3Header hdr)
-{
- u_int8_t version = MP4AV_Mp3GetHdrVersion(hdr);
- u_int8_t layer = MP4AV_Mp3GetHdrLayer(hdr);
- u_int8_t bitRateIndex1;
- u_int8_t bitRateIndex2 = (hdr >> 12) & 0xF;
-
- if (version == 3) {
- /* MPEG-1 */
- bitRateIndex1 = layer - 1;
- } else {
- /* MPEG-2 or MPEG-2.5 */
- if (layer == 3) {
- /* Layer I */
- bitRateIndex1 = 4;
- } else {
- bitRateIndex1 = 3;
- }
- }
- return Mp3BitRates[bitRateIndex1][bitRateIndex2-1];
-}
-/*
- * compute MP3 frame size
- */
-extern "C" u_int16_t MP4AV_Mp3GetFrameSize(MP4AV_Mp3Header hdr)
-{
- /* extract the necessary fields from the MP3 header */
- u_int8_t version = MP4AV_Mp3GetHdrVersion(hdr);
- u_int8_t layer = MP4AV_Mp3GetHdrLayer(hdr);
- u_int8_t bitRateIndex1;
- u_int8_t bitRateIndex2 = (hdr >> 12) & 0xF;
- u_int8_t sampleRateIndex = (hdr >> 10) & 0x3;
- bool isPadded = (hdr >> 9) & 0x1;
- u_int16_t frameSize = 0;
-
- if (version == 3) {
- /* MPEG-1 */
- bitRateIndex1 = layer - 1;
- } else {
- /* MPEG-2 or MPEG-2.5 */
- if (layer == 3) {
- /* Layer I */
- bitRateIndex1 = 4;
- } else {
- bitRateIndex1 = 3;
- }
- }
-
- /* compute frame size */
- frameSize = (144 * 1000 * Mp3BitRates[bitRateIndex1][bitRateIndex2-1])
- / (Mp3SampleRates[version][sampleRateIndex] << !(version & 1));
-
- if (isPadded) {
- if (layer == 3) {
- /* Layer I */
- frameSize += 4; /* 4 byte pad is present */
- } else {
- frameSize++; /* 1 byte pad is present */
- }
- }
-
- return frameSize;
-}
-
-extern "C" u_int16_t
-MP4AV_Mp3GetAduOffset(const u_int8_t* pFrame, u_int32_t frameSize)
-{
- if (frameSize < 2) {
- return 0;
- }
-
- u_int8_t version = (pFrame[1] >> 3) & 0x3;
- u_int8_t layer = (pFrame[1] >> 1) & 0x3;
- bool isProtected = !(pFrame[1] & 0x1);
- u_int8_t crcSize = isProtected ? 2 : 0;
-
- // protect against garbage input
- if (frameSize < (u_int32_t)(5 + crcSize + (version == 3 ? 1 : 0))) {
- return 0;
- }
- if (layer != 1) {
- return 0;
- }
-
- if (version == 3) {
- // MPEG-1
- return (pFrame[4 + crcSize] << 1) | (pFrame[5 + crcSize] >> 7);
- } else {
- // MPEG-2 or 2.5
- return pFrame[4 + crcSize];
- }
-}
-
-extern "C" u_int8_t MP4AV_Mp3GetCrcSize(MP4AV_Mp3Header hdr)
-{
- return ((hdr & 0x00010000) ? 0 : 2);
-}
-
-extern "C" u_int8_t MP4AV_Mp3GetSideInfoSize(MP4AV_Mp3Header hdr)
-{
- u_int8_t version = MP4AV_Mp3GetHdrVersion(hdr);
- u_int8_t layer = MP4AV_Mp3GetHdrLayer(hdr);
- u_int8_t mode = (hdr >> 6) & 0x3;
- u_int8_t channels = (mode == 3 ? 1 : 2);
-
- // check that this is layer 3
- if (layer != 1) {
- return 0;
- }
-
- if (version == 3) {
- // MPEG-1
- if (channels == 1) {
- return 17;
- } else {
- return 32;
- }
- } else {
- // MPEG-2 or 2.5
- if (channels == 1) {
- return 9;
- } else {
- return 17;
- }
- }
-}
-
-extern "C" u_int8_t MP4AV_Mp3ToMp4AudioType(u_int8_t mpegVersion)
-{
- u_int8_t audioType = MP4_INVALID_AUDIO_TYPE;
-
- switch (mpegVersion) {
- case 3:
- audioType = MP4_MPEG1_AUDIO_TYPE;
- break;
- case 2:
- case 0:
- audioType = MP4_MPEG2_AUDIO_TYPE;
- break;
- case 1:
- break;
- }
- return audioType;
-}
-
--- a/common/mp4av/mp4av.h
+++ /dev/null
@@ -1,46 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_INCLUDED__
-#define __MP4AV_INCLUDED__
-
-#include <mp4.h>
-
-#ifdef __cplusplus
-/* exploit C++ ability of default values for function parameters */
-#define DEFAULT_PARM(x) =x
-#else
-#define DEFAULT_PARM(x)
-#endif
-
-/* MP4AV library API */
-#include "mp4av_aac.h"
-#include "mp4av_adts.h"
-#include "mp4av_mp3.h"
-#include "mp4av_mpeg4.h"
-#include "mp4av_audio.h"
-#include "mp4av_hinters.h"
-#include "mp4av_mpeg3.h"
-
-#undef DEFAULT_PARM
-
-#endif /* __MP4AV_INCLUDED__ */
-
--- a/common/mp4av/mp4av_aac.h
+++ /dev/null
@@ -1,67 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_AAC_INCLUDED__
-#define __MP4AV_AAC_INCLUDED__
-
-#define MP4AV_AAC_MAIN_PROFILE 0
-#define MP4AV_AAC_LC_PROFILE 1
-#define MP4AV_AAC_SSR_PROFILE 2
-#define MP4AV_AAC_LTP_PROFILE 3
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-u_int8_t MP4AV_AacConfigGetSamplingRateIndex(
- u_int8_t* pConfig);
-
-u_int32_t MP4AV_AacConfigGetSamplingRate(
- u_int8_t* pConfig);
-
-u_int16_t MP4AV_AacConfigGetSamplingWindow(
- u_int8_t* pConfig);
-
-u_int8_t MP4AV_AacConfigGetChannels(
- u_int8_t* pConfig);
-
-bool MP4AV_AacGetConfigurationFromAdts(
- u_int8_t** ppConfig,
- u_int32_t* pConfigLength,
- u_int8_t* pAdtsHdr);
-
-bool MP4AV_AacGetConfiguration(
- u_int8_t** ppConfig,
- u_int32_t* pConfigLength,
- u_int8_t profile,
- u_int32_t samplingRate,
- u_int8_t channels);
-bool MP4AV_AacGetConfiguration_SBR(
- u_int8_t** ppConfig,
- u_int32_t* pConfigLength,
- u_int8_t profile,
- u_int32_t samplingRate,
- u_int8_t channels);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* __MP4AV_AAC_INCLUDED__ */
--- a/common/mp4av/mp4av_adts.h
+++ /dev/null
@@ -1,87 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_ADTS_INCLUDED__
-#define __MP4AV_ADTS_INCLUDED__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define NUM_ADTS_SAMPLING_RATES 16
-
-extern u_int32_t AdtsSamplingRates[NUM_ADTS_SAMPLING_RATES];
-
-bool MP4AV_AdtsGetNextFrame(
- u_int8_t* pSrc,
- u_int32_t srcLength,
- u_int8_t** ppFrame,
- u_int32_t* pFrameSize);
-
-u_int16_t MP4AV_AdtsGetFrameSize(
- u_int8_t* pHdr);
-
-u_int16_t MP4AV_AdtsGetHeaderBitSize(
- u_int8_t* pHdr);
-
-u_int16_t MP4AV_AdtsGetHeaderByteSize(
- u_int8_t* pHdr);
-
-u_int8_t MP4AV_AdtsGetVersion(
- u_int8_t* pHdr);
-
-u_int8_t MP4AV_AdtsGetProfile(
- u_int8_t* pHdr);
-
-u_int8_t MP4AV_AdtsGetSamplingRateIndex(
- u_int8_t* pHdr);
-
-u_int8_t MP4AV_AdtsFindSamplingRateIndex(
- u_int32_t samplingRate);
-
-u_int32_t MP4AV_AdtsGetSamplingRate(
- u_int8_t* pHdr);
-
-u_int8_t MP4AV_AdtsGetChannels(
- u_int8_t* pHdr);
-
-bool MP4AV_AdtsMakeFrame(
- u_int8_t* pData,
- u_int16_t dataLength,
- bool isMpeg2,
- u_int8_t profile,
- u_int32_t samplingFrequency,
- u_int8_t channels,
- u_int8_t** ppAdtsData,
- u_int32_t* pAdtsDataLength);
-
-bool MP4AV_AdtsMakeFrameFromMp4Sample(
- MP4FileHandle mp4File,
- MP4TrackId trackId,
- MP4SampleId sampleId,
- int force_profile,
- u_int8_t** ppAdtsData,
- u_int32_t* pAdtsDataLength);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* __MP4AV_ADTS_INCLUDED__ */
--- a/common/mp4av/mp4av_audio.h
+++ /dev/null
@@ -1,45 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_AUDIO_INCLUDED__
-#define __MP4AV_AUDIO_INCLUDED__
-
-// Audio Track Utitlites
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-u_int8_t MP4AV_AudioGetChannels(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId);
-
-u_int32_t MP4AV_AudioGetSamplingRate(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId);
-
-u_int16_t MP4AV_AudioGetSamplingWindow(
- MP4FileHandle mp4File,
- MP4TrackId audioTrackId);
-#ifdef __cplusplus
-}
-#endif
-#endif /* __MP4AV_AUDIO_INCLUDED__ */
-
--- a/common/mp4av/mp4av_common.h
+++ /dev/null
@@ -1,33 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_COMMON_INCLUDED__
-#define __MP4AV_COMMON_INCLUDED__
-
-// the external interface
-#include "mp4av.h"
-
-// the internal interfaces
-#include "mbs.h"
-#include "audio_hinters.h"
-
-#endif /* __MP4AV_COMMON_INCLUDED__ */
-
--- a/common/mp4av/mp4av_hinters.h
+++ /dev/null
@@ -1,83 +1,0 @@
-/*
- * 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. 2001-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_HINTERS_INCLUDED__
-#define __MP4AV_HINTERS_INCLUDED__
-
-#define MP4AV_DFLT_PAYLOAD_SIZE 1460
-
-// Audio Hinters
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-bool MP4AV_Rfc2250Hinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- bool interleave DEFAULT_PARM(false),
- u_int16_t maxPayloadSize DEFAULT_PARM(MP4AV_DFLT_PAYLOAD_SIZE));
-
-bool MP4AV_Rfc3119Hinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- bool interleave DEFAULT_PARM(false),
- u_int16_t maxPayloadSize DEFAULT_PARM(MP4AV_DFLT_PAYLOAD_SIZE));
-
-bool MP4AV_RfcIsmaHinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- bool interleave DEFAULT_PARM(false),
- u_int16_t maxPayloadSize DEFAULT_PARM(MP4AV_DFLT_PAYLOAD_SIZE));
-
-
-// Video Hinters
-MP4TrackId MP4AV_Rfc3016_HintTrackCreate(MP4FileHandle mp4File,
- MP4TrackId mediaTrackId);
-void MP4AV_Rfc3016_HintAddSample (
- MP4FileHandle mp4File,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- uint8_t *pSampleBuffer,
- uint32_t sampleSize,
- MP4Duration duration,
- MP4Duration renderingOffset,
- bool isSyncSample,
- uint16_t maxPayloadSize);
-
-bool MP4AV_Rfc3016Hinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- u_int16_t maxPayloadSize DEFAULT_PARM(MP4AV_DFLT_PAYLOAD_SIZE));
-
-bool L16Hinter(MP4FileHandle mp4File,
- MP4TrackId mediaTrackID,
- uint16_t maxPayloadSize DEFAULT_PARM(MP4AV_DFLT_PAYLOAD_SIZE));
-
-bool Mpeg12Hinter(MP4FileHandle mp4File,
- MP4TrackId mediaTrackID,
- uint16_t maxPayloadSize DEFAULT_PARM(MP4AV_DFLT_PAYLOAD_SIZE));
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __MP4AV_HINTERS_INCLUDED__ */
-
--- a/common/mp4av/mp4av_mp3.h
+++ /dev/null
@@ -1,68 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_MP3_INCLUDED__
-#define __MP4AV_MP3_INCLUDED__
-
-typedef u_int32_t MP4AV_Mp3Header;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-bool MP4AV_Mp3GetNextFrame(
- const u_int8_t* pSrc,
- u_int32_t srcLength,
- const u_int8_t** ppFrame,
- u_int32_t* pFrameSize,
- bool allowLayer4 DEFAULT_PARM(false),
- bool donthack DEFAULT_PARM(false));
-
-MP4AV_Mp3Header MP4AV_Mp3HeaderFromBytes(const u_int8_t* pBytes);
-
-u_int8_t MP4AV_Mp3GetHdrVersion(MP4AV_Mp3Header hdr);
-
-u_int8_t MP4AV_Mp3GetHdrLayer(MP4AV_Mp3Header hdr);
-
-u_int8_t MP4AV_Mp3GetChannels(MP4AV_Mp3Header hdr);
-
-u_int16_t MP4AV_Mp3GetHdrSamplingRate(MP4AV_Mp3Header hdr);
-
-u_int16_t MP4AV_Mp3GetHdrSamplingWindow(MP4AV_Mp3Header hdr);
-
-u_int16_t MP4AV_Mp3GetSamplingWindow(u_int16_t samplingRate);
-
-u_int16_t MP4AV_Mp3GetBitRate(MP4AV_Mp3Header hdr);
-
-u_int16_t MP4AV_Mp3GetFrameSize(MP4AV_Mp3Header hdr);
-
-u_int16_t MP4AV_Mp3GetAduOffset(const u_int8_t* pFrame, u_int32_t frameSize);
-
-u_int8_t MP4AV_Mp3GetCrcSize(MP4AV_Mp3Header hdr);
-
-u_int8_t MP4AV_Mp3GetSideInfoSize(MP4AV_Mp3Header hdr);
-
-u_int8_t MP4AV_Mp3ToMp4AudioType(u_int8_t mpegVersion);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* __MP4AV_MP3_INCLUDED__ */
--- a/common/mp4av/mp4av_mpeg3.h
+++ /dev/null
@@ -1,40 +1,0 @@
-/*
- * 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. 2002. All Rights Reserved.
- *
- * Contributor(s):
- * Bill May (wmay@cisco.com)
- */
-#ifndef __MP4AV_MPEG3_H__
-#define __MP4AV_MPEG3_H__ 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- int MP4AV_Mpeg3ParseSeqHdr(uint8_t *pbuffer, uint32_t buflen,
- int *have_mpeg2,
- uint32_t *height, uint32_t *width,
- double *frame_rate, double *bitrate);
-
- int MP4AV_Mpeg3PictHdrType(uint8_t *pbuffer);
-
- int MP4AV_Mpeg3FindGopOrPictHdr(uint8_t *pbuffer, uint32_t buflen, int *ftype);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/common/mp4av/mp4av_mpeg4.h
+++ /dev/null
@@ -1,104 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-#ifndef __MP4AV_MPEG4_INCLUDED__
-#define __MP4AV_MPEG4_INCLUDED__
-
-#define MP4AV_MPEG4_SYNC 0x000001
-#define MP4AV_MPEG4_VOL_START 0x20
-#define MP4AV_MPEG4_VOSH_START 0xB0
-#define MP4AV_MPEG4_VOSH_END 0xB1
-#define MP4AV_MPEG4_USER_DATA_START 0xB2
-#define MP4AV_MPEG4_GOV_START 0xB3
-#define MP4AV_MPEG4_VO_START 0xB5
-#define MP4AV_MPEG4_VOP_START 0xB6
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- uint8_t *MP4AV_Mpeg4FindVosh(uint8_t *pBuf, uint32_t bufLen);
-bool MP4AV_Mpeg4ParseVosh(
- u_int8_t* pVoshBuf,
- u_int32_t voshSize,
- u_int8_t* pProfileLevel);
-
-bool MP4AV_Mpeg4CreateVosh(
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int8_t profileLevel);
-
-bool MP4AV_Mpeg4CreateVo(
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int8_t objectId);
-
- uint8_t *MP4AV_Mpeg4FindVol(uint8_t *pBuf, uint32_t buflen);
-
-bool MP4AV_Mpeg4ParseVol(
- u_int8_t* pVolBuf,
- u_int32_t volSize,
- u_int8_t* pTimeBits,
- u_int16_t* pTimeTicks,
- u_int16_t* pFrameDuration,
- u_int16_t* pFrameWidth,
- u_int16_t* pFrameHeight,
- u_int8_t * aspectRatioDefine DEFAULT_PARM(NULL),
- u_int8_t * aspectRatioWidth DEFAULT_PARM(NULL),
- u_int8_t * aspectRatioHeight DEFAULT_PARM(NULL));
-bool MP4AV_Mpeg4CreateVol(
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int8_t profile,
- float frameRate,
- bool shortTime,
- bool variableRate,
- u_int16_t width,
- u_int16_t height,
- u_int8_t quantType,
- u_int8_t* pTimeBits DEFAULT_PARM(NULL));
-
-bool MP4AV_Mpeg4ParseGov(
- u_int8_t* pGovBuf,
- u_int32_t govSize,
- u_int8_t* pHours,
- u_int8_t* pMinutes,
- u_int8_t* pSeconds);
-
- uint8_t *MP4AV_Mpeg4FindVop(uint8_t *pBuf, uint32_t buflen);
-bool MP4AV_Mpeg4ParseVop(
- u_int8_t* pVopBuf,
- u_int32_t vopSize,
- u_char* pVopType,
- u_int8_t timeBits,
- u_int16_t timeTicks,
- u_int32_t* pVopTimeIncrement);
-
-u_char MP4AV_Mpeg4GetVopType(
- u_int8_t* pVopBuf,
- u_int32_t vopSize);
-
- const char *MP4AV_Mpeg4VisualProfileName (uint8_t profile);
-#ifdef __cplusplus
-}
-#endif
-#endif /* __MP4AV_MPEG4_INCLUDED__ */
--- a/common/mp4av/mpeg3.cpp
+++ /dev/null
@@ -1,450 +1,0 @@
-/*
- * 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. 2002. All Rights Reserved.
- *
- * Contributor(s):
- * Bill May (wmay@cisco.com)
- */
-
-#include "mpeg4ip.h"
-#include "mp4av.h"
-
-//#define DEBUG_MPEG3_HINT 1
-
-static double mpeg3_frame_rate_table[16] =
-{
- 0.0, /* Pad */
- 24000.0/1001.0, /* Official frame rates */
- 24.0,
- 25.0,
- 30000.0/1001.0,
- 30.0,
- 50.0,
- ((60.0*1000.0)/1001.0),
- 60.0,
-
- 1, /* Unofficial economy rates */
- 5,
- 10,
- 12,
- 15,
- 0,
- 0,
-};
-#define MPEG3_START_CODE_PREFIX 0x000001
-#define MPEG3_SEQUENCE_START_CODE 0x000001b3
-#define MPEG3_PICTURE_START_CODE 0x00000100
-#define MPEG3_GOP_START_CODE 0x000001b8
-#define MPEG3_EXT_START_CODE 0x000001b5
-#define MPEG3_SLICE_MIN_START 0x00000101
-#define MPEG3_SLICE_MAX_START 0x000001af
-
-#define SEQ_ID 1
-extern "C" int MP4AV_Mpeg3ParseSeqHdr (uint8_t *pbuffer,
- uint32_t buflen,
- int *have_mpeg2,
- uint32_t *height,
- uint32_t *width,
- double *frame_rate,
- double *bitrate)
-{
- uint32_t framerate_code;
- uint32_t bitrate_int;
- uint32_t bitrate_ext;
-#if 1
- uint32_t scode, ix;
- int found = -1;
- *have_mpeg2 = 0;
- buflen -= 6;
- bitrate_int = 0;
- for (ix = 0; ix < buflen; ix++, pbuffer++) {
- scode = (pbuffer[0] << 24) | (pbuffer[1] << 16) | (pbuffer[2] << 8) |
- pbuffer[3];
-
- if (scode == MPEG3_SEQUENCE_START_CODE) {
- pbuffer += sizeof(uint32_t);
- *width = (pbuffer[0]);
- *width <<= 4;
- *width |= ((pbuffer[1] >> 4) &0xf);
- *height = (pbuffer[1] & 0xf);
- *height <<= 8;
- *height |= pbuffer[2];
- framerate_code = pbuffer[3] & 0xf;
- *frame_rate = mpeg3_frame_rate_table[framerate_code];
- // 18 bits
- bitrate_int = (pbuffer[4] << 10) |
- (pbuffer[5] << 2) |
- ((pbuffer[6] >> 6) & 0x3);
- *bitrate = bitrate_int;
- *bitrate *= 400.0;
- ix += sizeof(uint32_t) + 7;
- pbuffer += 7;
- found = 0;
- } else if (found == 0) {
- if (scode == MPEG3_EXT_START_CODE) {
- pbuffer += sizeof(uint32_t);
- ix += sizeof(uint32_t);
- switch ((pbuffer[0] >> 4) & 0xf) {
- case SEQ_ID:
- *have_mpeg2 = 1;
- *height = ((pbuffer[1] & 0x1) << 13) |
- ((pbuffer[2] & 0x80) << 5) |
- (*height & 0x0fff);
- *width = (((pbuffer[2] >> 5) & 0x3) << 12) | (*width & 0x0fff);
- bitrate_ext = (pbuffer[2] & 0x1f) << 7;
- bitrate_ext |= (pbuffer[3] >> 1) & 0x7f;
- bitrate_int |= (bitrate_ext << 18);
- *bitrate = bitrate_int;
- *bitrate *= 400.0;
- break;
- default:
- break;
- }
- pbuffer++;
- ix++;
- } else if (scode == MPEG3_PICTURE_START_CODE) {
- return found;
- }
- }
- }
- return found;
-
-#else
- // if you want to do the whole frame
- int ix;
- CBitstream bs(pbuffer, buflen);
-
-
- try {
-
- while (bs.PeekBits(32) != MPEG3_SEQUENCE_START_CODE) {
- bs.GetBits(8);
- }
-
- bs.GetBits(32); // start code
-
- *height = bs.GetBits(12);
- *width = bs.GetBits(12);
- bs.GetBits(4);
- framerate_code = bs.GetBits(4);
- *frame_rate = mpeg3_frame_rate_table[framerate_code];
-
- bs.GetBits(18); // bitrate
- bs.GetBits(1); // marker bit
- bs.GetBits(10); // vbv buffer
- bs.GetBits(1); // constrained params
- if (bs.GetBits(1)) { // intra_quantizer_matrix
- for (ix = 0; ix < 64; ix++) {
- bs.GetBits(8);
- }
- }
- if (bs.GetBits(1)) { // non_intra_quantizer_matrix
- for (ix = 0; ix < 64; ix++) {
- bs.GetBits(8);
- }
- }
- } catch (...) {
- return false;
- }
- return true;
-#endif
-}
-
-extern "C" int MP4AV_Mpeg3PictHdrType (uint8_t *pbuffer)
-{
- pbuffer += sizeof(uint32_t);
- return ((pbuffer[1] >> 3) & 0x7);
-}
-
-static int FindNextStart (uint8_t *pbuffer,
- uint32_t buflen,
- uint32_t *optr,
- uint32_t *scode)
-{
- uint32_t value;
- uint32_t offset;
-
- for (offset = 0; offset < buflen; offset++, pbuffer++) {
- value = (pbuffer[0] << 16) | (pbuffer[1] << 8) | (pbuffer[2] << 0);
-
- if (value == MPEG3_START_CODE_PREFIX) {
- *optr = offset;
- *scode = (value << 8) | pbuffer[3];
- return 0;
- }
- }
- return -1;
-}
-
-static int FindNextSliceStart (uint8_t *pbuffer,
- uint32_t startoffset,
- uint32_t buflen,
- uint32_t *slice_offset)
-{
- uint32_t slicestart, code;
- while (FindNextStart(pbuffer + startoffset,
- buflen - startoffset,
- &slicestart,
- &code) >= 0) {
-#ifdef DEBUG_MPEG3_HINT
- printf("Code %x at offset %d\n",
- code, startoffset + slicestart);
-#endif
- if ((code >= MPEG3_SLICE_MIN_START) &&
- (code <= MPEG3_SLICE_MAX_START)) {
- *slice_offset = slicestart + startoffset;
- return 0;
- }
- startoffset += slicestart + 4;
- }
- return -1;
-}
-
-extern "C" int MP4AV_Mpeg3FindGopOrPictHdr (uint8_t *pbuffer,
- uint32_t buflen,
- int *frame_type)
-{
- uint32_t value;
- uint32_t offset;
- int ftype;
- for (offset = 0; offset < buflen; offset++, pbuffer++) {
- value = (pbuffer[0] << 24) | (pbuffer[1] << 16) | (pbuffer[2] << 8) |
- pbuffer[3];
-
- if (value == MPEG3_PICTURE_START_CODE) {
- ftype = MP4AV_Mpeg3PictHdrType(pbuffer);
- if (frame_type != NULL) *frame_type = ftype;
- if (ftype == 1) {
- return 0;
- } else {
- return -1;
- }
- } else if (value == MPEG3_GOP_START_CODE) {
- return 1;
- }
- }
- return -1;
-}
-
-extern "C" bool Mpeg12Hinter (MP4FileHandle mp4file,
- MP4TrackId trackid,
- uint16_t maxPayloadSize)
-{
- uint32_t numSamples, maxSampleSize;
- uint8_t videoType;
- uint8_t rfc2250[4], rfc2250_2;
- uint32_t offset;
- uint32_t scode;
- int have_seq;
- bool stop;
- uint8_t *buffer, *pbuffer;
- uint8_t *pstart;
- uint8_t type;
- uint32_t next_slice, prev_slice;
- bool slice_at_begin;
- uint32_t sampleSize;
- MP4SampleId sid;
-
- MP4TrackId hintTrackId;
-
- numSamples = MP4GetTrackNumberOfSamples(mp4file, trackid);
- maxSampleSize = MP4GetTrackMaxSampleSize(mp4file, trackid);
-
- if (numSamples == 0) return false;
-
- videoType = MP4GetTrackEsdsObjectTypeId(mp4file, trackid);
-
- if (videoType != MP4_MPEG1_VIDEO_TYPE &&
- videoType != MP4_MPEG2_VIDEO_TYPE) {
- return false;
- }
-
- hintTrackId = MP4AddHintTrack(mp4file, trackid);
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- return false;
- }
-
- uint8_t payload = 32;
- MP4SetHintTrackRtpPayload(mp4file, hintTrackId, "MPV", &payload, 0);
-
-
- buffer = (uint8_t *)malloc(maxSampleSize);
- if (buffer == NULL) {
- MP4DeleteTrack(mp4file, hintTrackId);
- return false;
- }
-
- maxPayloadSize -= 24; // this is for the 4 byte header
-
- for (sid = 1; sid <= numSamples; sid++) {
- sampleSize = maxSampleSize;
- MP4Timestamp startTime;
- MP4Duration duration;
- MP4Duration renderingOffset;
- bool isSyncSample;
-
- bool rc = MP4ReadSample(mp4file, trackid, sid,
- &buffer, &sampleSize,
- &startTime, &duration,
- &renderingOffset, &isSyncSample);
-#ifdef DEBUG_MPEG3_HINT
- printf("sid %d - sample size %d\n", sid, sampleSize);
-#endif
- if (rc == false) {
- MP4DeleteTrack(mp4file, hintTrackId);
- return false;
- }
-
- // need to add rfc2250 header
- offset = 0;
- have_seq = 0;
- pbuffer = buffer;
- stop = false;
- do {
- uint32_t oldoffset;
- oldoffset = offset;
- if (FindNextStart(pbuffer + offset,
- sampleSize - offset,
- &offset,
- &scode) < 0) {
- // didn't find the start code
-#ifdef DEBUG_MPEG3_HINT
- printf("didn't find start code\n");
-#endif
- stop = true;
- } else {
- offset += oldoffset;
-#ifdef DEBUG_MPEG3_HINT
- printf("next sscode %x found at %d\n", scode, offset);
-#endif
- if (scode == MPEG3_SEQUENCE_START_CODE) have_seq = 1;
- offset += 4; // start with next value
- }
- } while (scode != MPEG3_PICTURE_START_CODE && stop == false);
-
- pstart = pbuffer + offset; // point to inside of picture start
- type = (pstart[1] >> 3) & 0x7;
-
- rfc2250[0] = (*pstart >> 6) & 0x3;
- rfc2250[1] = (pstart[0] << 2) | ((pstart[1] >> 6) & 0x3); // temporal ref
- rfc2250[2] = type;
- rfc2250_2 = rfc2250[2];
- if (have_seq != 0) {
- rfc2250[2] |= 0x20;
- have_seq = 0;
- }
-
- rfc2250[3] = 0;
- if (type == 2 || type == 3) {
- rfc2250[3] = pstart[3] << 5;
- if ((pstart[4] & 0x80) != 0) rfc2250[3] |= 0x10;
- if (type == 3) {
- rfc2250[3] |= (pstart[4] >> 3) & 0xf;
- }
- }
-
- MP4AddRtpVideoHint(mp4file, hintTrackId, type == 3, renderingOffset);
- // Find the next slice. Then we can add the header if the next
- // slice will be in the start. This lets us set the S bit in
- // rfc2250[2]. Then we need to loop to find the next slice that's
- // not in the buffer size - this should be in the while loop.
-
- prev_slice = 0;
- if (FindNextSliceStart(pbuffer, offset, sampleSize, &next_slice) < 0) {
- slice_at_begin = false;
- } else {
- slice_at_begin = true;
- }
-
-#ifdef DEBUG_MPEG3_HINT
- printf("starting slice at %d\n", next_slice);
-#endif
- offset = 0;
- bool nomoreslices = false;
- bool found_slice = slice_at_begin;
- bool onfirst = true;
-
- while (sampleSize > 0) {
- bool isLastPacket;
- uint32_t len_to_write;
-
- if (sampleSize <= maxPayloadSize) {
- // leave started_slice alone
- len_to_write = sampleSize;
- isLastPacket = true;
- prev_slice = 0;
- } else {
- found_slice = (onfirst == false) && (nomoreslices == false) && (next_slice <= maxPayloadSize);
- onfirst = false;
- isLastPacket = false;
-
- while (nomoreslices == false && next_slice <= maxPayloadSize) {
- prev_slice = next_slice;
- if (FindNextSliceStart(pbuffer, next_slice + 4, sampleSize, &next_slice) >= 0) {
-#ifdef DEBUG_MPEG3_HINT
- printf("prev_slice %u next slice %u %u\n", prev_slice, next_slice,
- offset + next_slice);
-#endif
- found_slice = true;
- } else {
- // at end
- nomoreslices = true;
- }
- }
- // prev_slice should have the end value. If it's not 0, we have
- // the end of the slice.
- if (found_slice) len_to_write = prev_slice;
- else len_to_write = MIN(maxPayloadSize, sampleSize);
- }
-
- rfc2250[2] = rfc2250_2;
- if (slice_at_begin) {
- rfc2250[2] |= 0x10; // set b bit
- }
- if (found_slice || isLastPacket) {
- rfc2250[2] |= 0x08; // set end of slice bit
- slice_at_begin = true; // for next time
- } else {
- slice_at_begin = false;
- }
-
-#ifdef DEBUG_MPEG3_HINT
- printf("Adding packet, sid %u prev slice %u len_to_write %u\n",
- sid, prev_slice, len_to_write);
- printf("Next slice %u offset %u %x %x %x %x\n\n",
- next_slice, offset,
- rfc2250[0], rfc2250[1], rfc2250[2], rfc2250[3]);
-#endif
-
- // okay - we can now write out this packet.
- MP4AddRtpPacket(mp4file, hintTrackId, isLastPacket);
- // add the 4 byte header
- MP4AddRtpImmediateData(mp4file, hintTrackId, rfc2250, sizeof(rfc2250));
-
- // add the immediate data
- MP4AddRtpSampleData(mp4file, hintTrackId, sid, offset, len_to_write);
- offset += len_to_write;
- sampleSize -= len_to_write;
- prev_slice = 0;
- next_slice -= len_to_write;
- pbuffer += len_to_write;
- }
- MP4WriteRtpHint(mp4file, hintTrackId, duration, type == 1);
- }
-
- free(buffer);
- return true;
-}
--- a/common/mp4av/mpeg4.cpp
+++ /dev/null
@@ -1,531 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-extern "C" uint8_t *MP4AV_Mpeg4FindVosh (uint8_t *pBuf, uint32_t buflen)
-{
- while (buflen > 4) {
- if (pBuf[0] == 0x0 &&
- pBuf[1] == 0x0 &&
- pBuf[2] == 0x1 &&
- pBuf[3] == MP4AV_MPEG4_VOSH_START) {
- return pBuf;
- }
- pBuf++;
- buflen--;
- }
- return NULL;
-}
-
-extern "C" bool MP4AV_Mpeg4ParseVosh(
- u_int8_t* pVoshBuf,
- u_int32_t voshSize,
- u_int8_t* pProfileLevel)
-{
- CMemoryBitstream vosh;
-
- vosh.SetBytes(pVoshBuf, voshSize);
-
- try {
- vosh.GetBits(32); // start code
- *pProfileLevel = vosh.GetBits(8);
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-extern "C" bool MP4AV_Mpeg4CreateVosh(
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int8_t profileLevel)
-{
- CMemoryBitstream vosh;
-
- try {
- if (*ppBytes) {
- // caller must guarantee buffer against overrun
- memset((*ppBytes) + (*pNumBytes), 0, 5);
- vosh.SetBytes(*ppBytes, (*pNumBytes) + 5);
- vosh.SetBitPosition((*pNumBytes) << 3);
- } else {
- vosh.AllocBytes(5);
- }
-
- vosh.PutBits(MP4AV_MPEG4_SYNC, 24);
- vosh.PutBits(MP4AV_MPEG4_VOSH_START, 8);
- vosh.PutBits(profileLevel, 8);
-
- *ppBytes = vosh.GetBuffer();
- *pNumBytes = vosh.GetNumberOfBytes();
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-extern "C" bool MP4AV_Mpeg4CreateVo(
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int8_t objectId)
-{
- CMemoryBitstream vo;
-
- try {
- if (*ppBytes) {
- // caller must guarantee buffer against overrun
- memset((*ppBytes) + (*pNumBytes), 0, 9);
- vo.SetBytes(*ppBytes, *pNumBytes + 9);
- vo.SetBitPosition((*pNumBytes) << 3);
- } else {
- vo.AllocBytes(9);
- }
-
- vo.PutBits(MP4AV_MPEG4_SYNC, 24);
- vo.PutBits(MP4AV_MPEG4_VO_START, 8);
- vo.PutBits(0x08, 8); // no verid, priority, or signal type
- vo.PutBits(MP4AV_MPEG4_SYNC, 24);
- vo.PutBits(objectId - 1, 8);
-
- *ppBytes = vo.GetBuffer();
- *pNumBytes = vo.GetNumberOfBytes();
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-extern "C" uint8_t *MP4AV_Mpeg4FindVol (uint8_t *pBuf, uint32_t buflen)
-{
- while (buflen > 4) {
- if (pBuf[0] == 0x0 &&
- pBuf[1] == 0x0 &&
- pBuf[2] == 0x1 &&
- (pBuf[3] & 0xf0) == MP4AV_MPEG4_VOL_START) {
- return pBuf;
- }
- pBuf++;
- buflen--;
- }
- return NULL;
-}
-extern "C" uint8_t *MP4AV_Mpeg4FindVop (uint8_t *pBuf, uint32_t buflen)
-{
- while (buflen > 4) {
- if (pBuf[0] == 0x0 &&
- pBuf[1] == 0x0 &&
- pBuf[2] == 0x1 &&
- pBuf[3] == MP4AV_MPEG4_VOP_START) {
- return pBuf;
- }
- pBuf++;
- buflen--;
- }
- return NULL;
-}
-
-extern "C" bool MP4AV_Mpeg4ParseVol(
- u_int8_t* pVolBuf,
- u_int32_t volSize,
- u_int8_t* pTimeBits,
- u_int16_t* pTimeTicks,
- u_int16_t* pFrameDuration,
- u_int16_t* pFrameWidth,
- u_int16_t* pFrameHeight,
- u_int8_t * aspectRatioDefine,
- u_int8_t * aspectRatioWidth,
- u_int8_t * aspectRatioHeight)
-
-{
- CMemoryBitstream vol;
- uint8_t aspect;
-
- vol.SetBytes(pVolBuf, volSize);
-
- try {
- vol.SkipBits(32); // start code
-
- vol.SkipBits(1); // random accessible vol
- vol.SkipBits(8); // object type id
- u_int8_t verid = 1;
- if (vol.GetBits(1)) { // is object layer id
- verid = vol.GetBits(4); // object layer verid
- vol.SkipBits(3); // object layer priority
- }
- aspect = vol.GetBits(4);
- if (aspectRatioDefine != NULL)
- *aspectRatioDefine = aspect;
- if (aspect == 0xF) { // aspect ratio info
- if (aspectRatioWidth != NULL)
- *aspectRatioWidth = vol.GetBits(8);
- else
- vol.SkipBits(8); // par width
- if (aspectRatioHeight != NULL)
- *aspectRatioHeight = vol.GetBits(8);
- else
- vol.SkipBits(8); // par height
- }
- if (vol.GetBits(1)) { // vol control parameters
- vol.SkipBits(2); // chroma format
- vol.SkipBits(1); // low delay
- if (vol.GetBits(1)) { // vbv parameters
- vol.SkipBits(15); // first half bit rate
- vol.SkipBits(1); // marker bit
- vol.SkipBits(15); // latter half bit rate
- vol.SkipBits(1); // marker bit
- vol.SkipBits(15); // first half vbv buffer size
- vol.SkipBits(1); // marker bit
- vol.SkipBits(3); // latter half vbv buffer size
- vol.SkipBits(11); // first half vbv occupancy
- vol.SkipBits(1); // marker bit
- vol.SkipBits(15); // latter half vbv occupancy
- vol.SkipBits(1); // marker bit
- }
- }
- u_int8_t shape = vol.GetBits(2); // object layer shape
- if (shape == 3 /* GRAYSCALE */ && verid != 1) {
- vol.SkipBits(4); // object layer shape extension
- }
- vol.SkipBits(1); // marker bit
- *pTimeTicks = vol.GetBits(16); // vop time increment resolution
-
- u_int8_t i;
- u_int32_t powerOf2 = 1;
- for (i = 0; i < 16; i++) {
- if (*pTimeTicks < powerOf2) {
- break;
- }
- powerOf2 <<= 1;
- }
- *pTimeBits = i;
-
- vol.SkipBits(1); // marker bit
- if (vol.GetBits(1)) { // fixed vop rate
- // fixed vop time increment
- *pFrameDuration = vol.GetBits(*pTimeBits);
- } else {
- *pFrameDuration = 0;
- }
- if (shape == 0 /* RECTANGULAR */) {
- vol.SkipBits(1); // marker bit
- *pFrameWidth = vol.GetBits(13); // object layer width
- vol.SkipBits(1); // marker bit
- *pFrameHeight = vol.GetBits(13);// object layer height
- vol.SkipBits(1); // marker bit
- } else {
- *pFrameWidth = 0;
- *pFrameHeight = 0;
- }
- // there's more, but we don't need it
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-extern "C" bool MP4AV_Mpeg4CreateVol(
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int8_t profile,
- float frameRate,
- bool shortTime,
- bool variableRate,
- u_int16_t width,
- u_int16_t height,
- u_int8_t quantType,
- u_int8_t* pTimeBits)
-{
- CMemoryBitstream vol;
-
- try {
- if (*ppBytes) {
- // caller must guarantee buffer against overrun
- memset((*ppBytes) + (*pNumBytes), 0, 20);
- vol.SetBytes(*ppBytes, *pNumBytes + 20);
- vol.SetBitPosition((*pNumBytes) << 3);
- } else {
- vol.AllocBytes(20);
- }
-
- /* VOL - Video Object Layer */
- vol.PutBits(MP4AV_MPEG4_SYNC, 24);
- vol.PutBits(MP4AV_MPEG4_VOL_START, 8);
-
- /* 1 bit - random access = 0 (1 only if every VOP is an I frame) */
- vol.PutBits(0, 1);
- /*
- * 8 bits - type indication
- * = 1 (simple profile)
- * = 4 (main profile)
- */
- vol.PutBits(profile, 8);
- /* 1 bit - is object layer id = 1 */
- vol.PutBits(1, 1);
- /* 4 bits - visual object layer ver id = 1 */
- vol.PutBits(1, 4);
- /* 3 bits - visual object layer priority = 1 */
- vol.PutBits(1, 3);
-
- /* 4 bits - aspect ratio info = 1 (square pixels) */
- vol.PutBits(1, 4);
- /* 1 bit - VOL control params = 0 */
- vol.PutBits(0, 1);
- /* 2 bits - VOL shape = 0 (rectangular) */
- vol.PutBits(0, 2);
- /* 1 bit - marker = 1 */
- vol.PutBits(1, 1);
-
- u_int16_t ticks;
- if (shortTime /* && frameRate == (float)((int)frameRate) */) {
- ticks = (u_int16_t)(frameRate + 0.5);
- } else {
- ticks = 30000;
- }
- /* 16 bits - VOP time increment resolution */
- vol.PutBits(ticks, 16);
- /* 1 bit - marker = 1 */
- vol.PutBits(1, 1);
-
- u_int8_t rangeBits = 1;
- while (ticks > (1 << rangeBits)) {
- rangeBits++;
- }
- if (pTimeBits) {
- *pTimeBits = rangeBits;
- }
-
- /* 1 bit - fixed vop rate = 0 or 1 */
- if (variableRate) {
- vol.PutBits(0, 1);
- } else {
- vol.PutBits(1, 1);
-
- u_int16_t frameDuration =
- (u_int16_t)((float)ticks / frameRate);
-
- /* 1-16 bits - fixed vop time increment in ticks */
- vol.PutBits(frameDuration, rangeBits);
- }
- /* 1 bit - marker = 1 */
- vol.PutBits(1, 1);
- /* 13 bits - VOL width */
- vol.PutBits(width, 13);
- /* 1 bit - marker = 1 */
- vol.PutBits(1, 1);
- /* 13 bits - VOL height */
- vol.PutBits(height, 13);
- /* 1 bit - marker = 1 */
- vol.PutBits(1, 1);
- /* 1 bit - interlaced = 0 */
- vol.PutBits(0, 1);
-
- /* 1 bit - overlapped block motion compensation disable = 1 */
- vol.PutBits(1, 1);
-#if 0
- /* 2 bits - sprite usage = 0 */
- vol.PutBits(0, 2);
-#else
- vol.PutBits(0, 1);
-#endif
- /* 1 bit - not 8 bit pixels = 0 */
- vol.PutBits(0, 1);
- /* 1 bit - quant type = 0 */
- vol.PutBits(quantType, 1);
- if (quantType) {
- /* 1 bit - load intra quant mat = 0 */
- vol.PutBits(0, 1);
- /* 1 bit - load inter quant mat = 0 */
- vol.PutBits(0, 1);
- }
-#if 0
- /* 1 bit - quarter pixel = 0 */
- vol.PutBits(0, 1);
-#endif
- /* 1 bit - complexity estimation disable = 1 */
- vol.PutBits(1, 1);
- /* 1 bit - resync marker disable = 1 */
- vol.PutBits(1, 1);
- /* 1 bit - data partitioned = 0 */
- vol.PutBits(0, 1);
-#if 0
- /* 1 bit - newpred = 0 */
- vol.PutBits(0, 1);
- /* 1 bit - reduced resolution vop = 0 */
- vol.PutBits(0, 1);
-#endif
- /* 1 bit - scalability = 0 */
- vol.PutBits(0, 1);
-
- /* pad to byte boundary with 0 then as many 1's as needed */
- vol.PutBits(0, 1);
- if ((vol.GetBitPosition() & 7) != 0) {
- vol.PutBits(0xFF, 8 - (vol.GetBitPosition() & 7));
- }
-
- *ppBytes = vol.GetBuffer();
- *pNumBytes = vol.GetBitPosition() >> 3;
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-extern "C" bool MP4AV_Mpeg4ParseGov(
- u_int8_t* pGovBuf,
- u_int32_t govSize,
- u_int8_t* pHours,
- u_int8_t* pMinutes,
- u_int8_t* pSeconds)
-{
- CMemoryBitstream gov;
-
- gov.SetBytes(pGovBuf, govSize);
-
- try {
- gov.SkipBits(32); // start code
- *pHours = gov.GetBits(5);
- *pMinutes = gov.GetBits(6);
- gov.SkipBits(1); // marker bit
- *pSeconds = gov.GetBits(6);
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-static bool Mpeg4ParseShortHeaderVop(
- u_int8_t* pVopBuf,
- u_int32_t vopSize,
- u_char* pVopType)
-{
- CMemoryBitstream vop;
-
- vop.SetBytes(pVopBuf, vopSize);
-
- try {
- // skip start code, temporal ref, and into type
- vop.SkipBits(22 + 8 + 5 + 3);
- if (vop.GetBits(1) == 0) {
- *pVopType = 'I';
- } else {
- *pVopType = 'P';
- }
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-extern "C" bool MP4AV_Mpeg4ParseVop(
- u_int8_t* pVopBuf,
- u_int32_t vopSize,
- u_char* pVopType,
- u_int8_t timeBits,
- u_int16_t timeTicks,
- u_int32_t* pVopTimeIncrement)
-{
- CMemoryBitstream vop;
-
- vop.SetBytes(pVopBuf, vopSize);
-
- try {
- vop.SkipBits(32); // skip start code
-
- switch (vop.GetBits(2)) {
- case 0:
- /* Intra */
- *pVopType = 'I';
- break;
- case 1:
- /* Predictive */
- *pVopType = 'P';
- break;
- case 2:
- /* Bidirectional Predictive */
- *pVopType = 'B';
- break;
- case 3:
- /* Sprite */
- *pVopType = 'S';
- break;
- }
-
- if (!pVopTimeIncrement) {
- return true;
- }
-
- u_int8_t numSecs = 0;
- while (vop.GetBits(1) != 0) {
- numSecs++;
- }
- vop.SkipBits(1); // skip marker
- u_int16_t numTicks = vop.GetBits(timeBits);
- *pVopTimeIncrement = (numSecs * timeTicks) + numTicks;
- }
- catch (int e) {
- return false;
- }
-
- return true;
-}
-
-
-extern "C" u_char MP4AV_Mpeg4GetVopType(u_int8_t* pVopBuf, u_int32_t vopSize)
-{
- u_char vopType = 0;
-
- if (vopSize <= 4) {
- return vopType;
- }
-
- if (pVopBuf[0] == 0 && pVopBuf[1] == 0
- && (pVopBuf[2] & 0xFC) == 0x08 && (pVopBuf[3] & 0x03) == 0x02) {
- // H.263, (MPEG-4 short header mode)
- Mpeg4ParseShortHeaderVop(pVopBuf, vopSize, &vopType);
-
- } else {
- // MPEG-4 (normal mode)
- MP4AV_Mpeg4ParseVop(pVopBuf, vopSize, &vopType, 0, 0, NULL);
- }
-
- return vopType;
-}
-
--- a/common/mp4av/rfc2250.cpp
+++ /dev/null
@@ -1,166 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-extern "C" bool MP4AV_Rfc2250Hinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- bool interleave,
- u_int16_t maxPayloadSize)
-{
- // RFC 2250 doesn't support interleaving
- if (interleave) {
- return false;
- }
-
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- if (numSamples == 0) {
- return false;
- }
-
- u_int8_t audioType =
- MP4GetTrackEsdsObjectTypeId(mp4File, mediaTrackId);
-
- if (!MP4_IS_MP3_AUDIO_TYPE(audioType)) {
- return false;
- }
-
- MP4Duration sampleDuration =
- MP4AV_GetAudioSampleDuration(mp4File, mediaTrackId);
-
- if (sampleDuration == MP4_INVALID_DURATION) {
- return false;
- }
-
- MP4TrackId hintTrackId =
- MP4AddHintTrack(mp4File, mediaTrackId);
-
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- return false;
- }
-
- u_int8_t payloadNumber = MP4_SET_DYNAMIC_PAYLOAD;
- // use dynamic payload number
-
- if (MP4GetTrackTimeScale(mp4File, mediaTrackId) == 90000) {
- payloadNumber = 14;
- }
-
- MP4SetHintTrackRtpPayload(mp4File, hintTrackId,
- "MPA", &payloadNumber, 0);
-
- u_int16_t bytesThisHint = 0;
- u_int16_t samplesThisHint = 0;
-
- MP4AddRtpHint(mp4File, hintTrackId);
- MP4AddRtpPacket(mp4File, hintTrackId, true);
-
- for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
- u_int32_t sampleSize =
- MP4GetSampleSize(mp4File, mediaTrackId, sampleId);
-
- if (samplesThisHint > 0) {
- if (bytesThisHint + sampleSize <= maxPayloadSize) {
- // add the mp3 frame to current hint
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId, 0, sampleSize);
-
- samplesThisHint++;
- bytesThisHint += sampleSize;
- continue;
- } else {
- // write out current hint
- MP4WriteRtpHint(mp4File, hintTrackId,
- samplesThisHint * sampleDuration);
-
- // start a new hint
- samplesThisHint = 0;
- bytesThisHint = 0;
-
- MP4AddRtpHint(mp4File, hintTrackId);
- MP4AddRtpPacket(mp4File, hintTrackId, true);
-
- // fall thru
- }
- }
-
- if (sampleSize + 4 <= maxPayloadSize) {
- // add rfc 2250 payload header
- static u_int32_t zero32 = 0;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&zero32, sizeof(zero32));
-
- // add the mp3 frame to current hint
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId, 0, sampleSize);
-
- bytesThisHint += (4 + sampleSize);
- } else {
- // jumbo frame, need to fragment it
- u_int16_t sampleOffset = 0;
-
- while (sampleOffset < sampleSize) {
- u_int16_t fragLength =
- MIN(sampleSize - sampleOffset, maxPayloadSize) - 4;
-
- u_int8_t payloadHeader[4];
- payloadHeader[0] = payloadHeader[1] = 0;
- payloadHeader[2] = (sampleOffset >> 8);
- payloadHeader[3] = sampleOffset & 0xFF;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, sizeof(payloadHeader));
-
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId, sampleOffset, fragLength);
-
- sampleOffset += fragLength;
-
- // if we're not at the last fragment
- if (sampleOffset < sampleSize) {
- MP4AddRtpPacket(mp4File, hintTrackId, false);
- }
- }
-
- // lie to ourselves so as to force next frame to output
- // our hint as is, and start a new hint for itself
- bytesThisHint = maxPayloadSize;
- }
-
- samplesThisHint = 1;
- }
-
- // write out current (final) hint
- MP4WriteRtpHint(mp4File, hintTrackId,
- samplesThisHint * sampleDuration);
-
- return true;
-}
-
--- a/common/mp4av/rfc3016.cpp
+++ /dev/null
@@ -1,203 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-#include <mp4av_mpeg4.h>
-
-extern "C" MP4TrackId MP4AV_Rfc3016_HintTrackCreate (MP4FileHandle mp4File,
- MP4TrackId mediaTrackId)
-{
- MP4TrackId hintTrackId =
- MP4AddHintTrack(mp4File, mediaTrackId);
-
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- return MP4_INVALID_TRACK_ID;
- }
-
- u_int8_t payloadNumber = MP4_SET_DYNAMIC_PAYLOAD;
-
- MP4SetHintTrackRtpPayload(mp4File, hintTrackId,
- "MP4V-ES", &payloadNumber, 0);
-
- /* get the mpeg4 video configuration */
- u_int8_t* pConfig;
- u_int32_t configSize;
- u_int8_t systemsProfileLevel = 0xFE;
-
- MP4GetTrackESConfiguration(mp4File, mediaTrackId, &pConfig, &configSize);
-
- if (pConfig) {
- // attempt to get a valid profile-level
- static u_int8_t voshStartCode[4] = {
- 0x00, 0x00, 0x01, MP4AV_MPEG4_VOSH_START
- };
- if (configSize >= 5 && !memcmp(pConfig, voshStartCode, 4)) {
- systemsProfileLevel = pConfig[4];
- }
- if (systemsProfileLevel == 0xFE) {
- u_int8_t iodProfileLevel = MP4GetVideoProfileLevel(mp4File);
- if (iodProfileLevel > 0 && iodProfileLevel < 0xFE) {
- systemsProfileLevel = iodProfileLevel;
- } else {
- systemsProfileLevel = 1;
- }
- }
-
- /* convert it into ASCII form */
- char* sConfig = MP4BinaryToBase16(pConfig, configSize);
- if (sConfig == NULL) {
- MP4DeleteTrack(mp4File, hintTrackId);
- free(pConfig);
- return MP4_INVALID_TRACK_ID;
- }
-
- /* create the appropriate SDP attribute */
- char* sdpBuf = (char*)malloc(strlen(sConfig) + 128);
-
- sprintf(sdpBuf,
- "a=fmtp:%u profile-level-id=%u; config=%s;\015\012",
- payloadNumber,
- systemsProfileLevel,
- sConfig);
-
- /* add this to the track's sdp */
- MP4AppendHintTrackSdp(mp4File, hintTrackId, sdpBuf);
-
- free(sConfig);
- free(sdpBuf);
- free(pConfig);
- }
- return hintTrackId;
-}
-
-extern "C" void MP4AV_Rfc3016_HintAddSample (
- MP4FileHandle mp4File,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- uint8_t *pSampleBuffer,
- uint32_t sampleSize,
- MP4Duration duration,
- MP4Duration renderingOffset,
- bool isSyncSample,
- uint16_t maxPayloadSize)
-{
- bool isBFrame =
- (MP4AV_Mpeg4GetVopType(pSampleBuffer, sampleSize) == 'B');
-
- MP4AddRtpVideoHint(mp4File, hintTrackId, isBFrame, renderingOffset);
-
- if (sampleId == 1) {
- MP4AddRtpESConfigurationPacket(mp4File, hintTrackId);
- }
-
- u_int32_t offset = 0;
- u_int32_t remaining = sampleSize;
-
- // TBD should scan for resync markers (if enabled in ES config)
- // and packetize on those boundaries
-
- while (remaining) {
- bool isLastPacket = false;
- u_int32_t length;
-
- if (remaining <= maxPayloadSize) {
- length = remaining;
- isLastPacket = true;
- } else {
- length = maxPayloadSize;
- }
-
- MP4AddRtpPacket(mp4File, hintTrackId, isLastPacket);
-
- MP4AddRtpSampleData(mp4File, hintTrackId, sampleId,
- offset, length);
-
- offset += length;
- remaining -= length;
- }
-
- MP4WriteRtpHint(mp4File, hintTrackId, duration, isSyncSample);
-}
-
-extern "C" bool MP4AV_Rfc3016Hinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- u_int16_t maxPayloadSize)
-{
- u_int32_t numSamples = MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
- u_int32_t maxSampleSize = MP4GetTrackMaxSampleSize(mp4File, mediaTrackId);
-
- if (numSamples == 0 || maxSampleSize == 0) {
- return false;
- }
-
- MP4TrackId hintTrackId =
- MP4AV_Rfc3016_HintTrackCreate(mp4File, mediaTrackId);
-
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- return false;
- }
-
- u_int8_t* pSampleBuffer = (u_int8_t*)malloc(maxSampleSize);
- if (pSampleBuffer == NULL) {
- MP4DeleteTrack(mp4File, hintTrackId);
- return false;
- }
-
- for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
- u_int32_t sampleSize = maxSampleSize;
- MP4Timestamp startTime;
- MP4Duration duration;
- MP4Duration renderingOffset;
- bool isSyncSample;
-
- bool rc = MP4ReadSample(
- mp4File, mediaTrackId, sampleId,
- &pSampleBuffer, &sampleSize,
- &startTime, &duration,
- &renderingOffset, &isSyncSample);
-
- if (!rc) {
- MP4DeleteTrack(mp4File, hintTrackId);
- CHECK_AND_FREE(pSampleBuffer);
- return false;
- }
-
- MP4AV_Rfc3016_HintAddSample(mp4File,
- hintTrackId,
- sampleId,
- pSampleBuffer,
- sampleSize,
- duration,
- renderingOffset,
- isSyncSample,
- maxPayloadSize);
- }
- CHECK_AND_FREE(pSampleBuffer);
-
- return true;
-}
-
--- a/common/mp4av/rfc3119.cpp
+++ /dev/null
@@ -1,526 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-// LATER get these on the stack so library is thread-safe!
-// file globals
-static bool doInterleave;
-static u_int32_t samplesPerPacket;
-static u_int32_t samplesPerGroup;
-static MP4AV_Mp3Header* pFrameHeaders = NULL;
-static u_int16_t* pAduOffsets = NULL;
-
-static bool GetFrameInfo(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4AV_Mp3Header** ppFrameHeaders,
- u_int16_t** ppAduOffsets)
-{
- // allocate memory to hold the frame info that we need
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- *ppFrameHeaders =
- (MP4AV_Mp3Header*)calloc((numSamples + 2), sizeof(u_int32_t));
- if (*ppFrameHeaders == NULL) {
- return false;
- }
-
- *ppAduOffsets =
- (u_int16_t*)calloc((numSamples + 2), sizeof(u_int16_t));
- if (*ppAduOffsets == NULL) {
- free(*ppFrameHeaders);
- return false;
- }
-
- // for each sample
- for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
- u_int8_t* pSample = NULL;
- u_int32_t sampleSize = 0;
-
- // read it
- MP4ReadSample(
- mp4File,
- mediaTrackId,
- sampleId,
- &pSample,
- &sampleSize);
-
- // extract the MP3 frame header
- MP4AV_Mp3Header mp3hdr =
- MP4AV_Mp3HeaderFromBytes(pSample);
-
- // store what we need
- (*ppFrameHeaders)[sampleId] = mp3hdr;
-
- (*ppAduOffsets)[sampleId] =
- MP4AV_Mp3GetAduOffset(pSample, sampleSize);
-
- free(pSample);
- }
-
- return true;
-}
-
-static u_int16_t GetFrameHeaderSize(MP4SampleId sampleId)
-{
- return 4 + MP4AV_Mp3GetCrcSize(pFrameHeaders[sampleId])
- + MP4AV_Mp3GetSideInfoSize(pFrameHeaders[sampleId]);
-}
-
-static u_int16_t GetFrameDataSize(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4SampleId sampleId)
-{
- return MP4GetSampleSize(mp4File, mediaTrackId, sampleId)
- - GetFrameHeaderSize(sampleId);
-}
-
-u_int32_t MP4AV_Rfc3119GetAduSize(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4SampleId sampleId)
-{
- u_int32_t sampleSize = MP4GetSampleSize(mp4File, mediaTrackId, sampleId);
-
- return pAduOffsets[sampleId] + sampleSize - pAduOffsets[sampleId + 1];
-}
-
-static u_int16_t GetMaxAduSize(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId)
-{
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- u_int16_t maxAduSize = 0;
-
- for (MP4SampleId sampleId = 1; sampleId <= numSamples; sampleId++) {
- u_int16_t aduSize =
- MP4AV_Rfc3119GetAduSize(mp4File, mediaTrackId, sampleId);
-
- if (aduSize > maxAduSize) {
- maxAduSize = aduSize;
- }
- }
-
- return maxAduSize;
-}
-
-static u_int16_t GetAduDataSize(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4SampleId sampleId)
-{
- return MP4AV_Rfc3119GetAduSize(mp4File, mediaTrackId, sampleId)
- - GetFrameHeaderSize(sampleId);
-}
-
-static void AddFrameHeader(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId)
-{
- // when interleaving we replace the 11 bit mp3 frame sync
- if (doInterleave) {
- // compute interleave index and interleave cycle from sampleId
- u_int8_t interleaveIndex =
- (sampleId - 1) % samplesPerGroup;
- u_int8_t interleaveCycle =
- ((sampleId - 1) / samplesPerGroup) & 0x7;
-
- u_int8_t interleaveHeader[4];
- interleaveHeader[0] =
- interleaveIndex;
- interleaveHeader[1] =
- (interleaveCycle << 5) | ((pFrameHeaders[sampleId] >> 16) & 0x1F);
- interleaveHeader[2] =
- (pFrameHeaders[sampleId] >> 8) & 0xFF;
- interleaveHeader[3] =
- pFrameHeaders[sampleId] & 0xFF;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- interleaveHeader, 4);
-
- // add crc and side info from current mp3 frame
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId, 4, GetFrameHeaderSize(sampleId) - 4);
- } else {
- // add mp3 header, crc, and side info from current mp3 frame
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId, 0, GetFrameHeaderSize(sampleId));
- }
-}
-
-static void CollectAduDataBlocks(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- u_int8_t* pNumBlocks,
- u_int32_t** ppOffsets,
- u_int32_t** ppSizes)
-{
- // go back from sampleId until
- // accumulated data bytes can fill sample's ADU
- MP4SampleId sid = sampleId;
- u_int8_t numBlocks = 1;
- u_int32_t prevDataBytes = 0;
- const u_int8_t maxBlocks = 8;
-
- *ppOffsets = new u_int32_t[maxBlocks];
- *ppSizes = new u_int32_t[maxBlocks];
-
- (*ppOffsets)[0] = GetFrameHeaderSize(sampleId);
- (*ppSizes)[0] = GetFrameDataSize(mp4File, mediaTrackId, sid);
-
- while (true) {
- if (prevDataBytes >= pAduOffsets[sampleId]) {
- u_int32_t adjust =
- prevDataBytes - pAduOffsets[sampleId];
-
- (*ppOffsets)[numBlocks-1] += adjust;
- (*ppSizes)[numBlocks-1] -= adjust;
-
- break;
- }
-
- sid--;
- numBlocks++;
-
- if (sid == 0 || numBlocks > maxBlocks) {
- throw EIO; // media bitstream error
- }
-
- (*ppOffsets)[numBlocks-1] = GetFrameHeaderSize(sid);
- (*ppSizes)[numBlocks-1] = GetFrameDataSize(mp4File, mediaTrackId, sid);
- prevDataBytes += (*ppSizes)[numBlocks-1];
- }
-
- *pNumBlocks = numBlocks;
-}
-
-bool MP4AV_Rfc3119Concatenator(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- u_int8_t samplesThisHint,
- MP4SampleId* pSampleIds,
- MP4Duration hintDuration,
- u_int16_t maxPayloadSize)
-{
- // handle degenerate case
- if (samplesThisHint == 0) {
- return true;
- }
-
- // construct the new hint
- MP4AddRtpHint(mp4File, hintTrackId);
- MP4AddRtpPacket(mp4File, hintTrackId, false);
-
- // rfc 3119 per adu payload header
- u_int8_t payloadHeader[2];
-
- // for each given sample
- for (u_int8_t i = 0; i < samplesThisHint; i++) {
- MP4SampleId sampleId = pSampleIds[i];
-
- u_int16_t aduSize =
- MP4AV_Rfc3119GetAduSize(mp4File, mediaTrackId, sampleId);
-
- // add the per ADU payload header
- payloadHeader[0] = 0x40 | ((aduSize >> 8) & 0x3F);
- payloadHeader[1] = aduSize & 0xFF;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, sizeof(payloadHeader));
- // add the mp3 frame header and side info
- AddFrameHeader(mp4File, mediaTrackId, hintTrackId, sampleId);
-
- // collect the info on the adu main data fragments
- u_int8_t numDataBlocks;
- u_int32_t* pDataOffsets;
- u_int32_t* pDataSizes;
-
- CollectAduDataBlocks(mp4File, mediaTrackId, hintTrackId, sampleId,
- &numDataBlocks, &pDataOffsets, &pDataSizes);
-
- // collect the needed blocks of data
- u_int16_t dataSize = 0;
- u_int16_t aduDataSize =
- GetAduDataSize(mp4File, mediaTrackId, sampleId);
-
- for (int8_t i = numDataBlocks - 1;
- i >= 0 && dataSize < aduDataSize; i--) {
- u_int32_t blockSize = pDataSizes[i];
-
- if ((u_int32_t)(aduDataSize - dataSize) < blockSize) {
- blockSize = (u_int32_t)(aduDataSize - dataSize);
- }
-
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId - i, pDataOffsets[i], blockSize);
-
- dataSize += blockSize;
- }
-
- delete [] pDataOffsets;
- delete [] pDataSizes;
- }
-
- // write the hint
- MP4WriteRtpHint(mp4File, hintTrackId, hintDuration);
-
- return true;
-}
-
-bool MP4AV_Rfc3119Fragmenter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- u_int32_t aduSize,
- MP4Duration sampleDuration,
- u_int16_t maxPayloadSize)
-{
- MP4AddRtpHint(mp4File, hintTrackId);
- MP4AddRtpPacket(mp4File, hintTrackId, false);
-
- // rfc 3119 payload header
- u_int8_t payloadHeader[2];
-
- u_int16_t payloadSize =
- sizeof(payloadHeader) + GetFrameHeaderSize(sampleId);
-
- // guard against ridiculous payload sizes
- if (payloadSize > maxPayloadSize) {
- return false;
- }
-
- // add the per ADU fragment payload header
- payloadHeader[0] = 0x40 | ((aduSize >> 8) & 0x3F);
- payloadHeader[1] = aduSize & 0xFF;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, sizeof(payloadHeader));
-
- payloadHeader[0] |= 0x80; // mark future packets as continuations
-
- // add the mp3 frame header and side info
- AddFrameHeader(mp4File, mediaTrackId, hintTrackId, sampleId);
-
- // collect the info on the adu main data fragments
- u_int8_t numDataBlocks;
- u_int32_t* pDataOffsets;
- u_int32_t* pDataSizes;
-
- CollectAduDataBlocks(mp4File, mediaTrackId, hintTrackId, sampleId,
- &numDataBlocks, &pDataOffsets, &pDataSizes);
-
- u_int16_t dataSize = 0;
- u_int16_t aduDataSize =
- GetAduDataSize(mp4File, mediaTrackId, sampleId);
-
- // for each data block
- for (int8_t i = numDataBlocks - 1; i >= 0 && dataSize < aduDataSize; i--) {
- u_int32_t blockSize = pDataSizes[i];
- u_int32_t blockOffset = pDataOffsets[i];
-
- // we may not need all of a block
- if ((u_int32_t)(aduDataSize - dataSize) < blockSize) {
- blockSize = (u_int32_t)(aduDataSize - dataSize);
- }
-
- dataSize += blockSize;
-
- // while data left in this block
- while (blockSize > 0) {
- u_int16_t payloadRemaining = maxPayloadSize - payloadSize;
-
- if (blockSize < payloadRemaining) {
- // the entire block fits in this packet
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId - i, blockOffset, blockSize);
-
- payloadSize += blockSize;
- blockSize = 0;
-
- } else {
- // the block fills this packet
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId - i, blockOffset, payloadRemaining);
-
- blockOffset += payloadRemaining;
- blockSize -= payloadRemaining;
-
- // start a new RTP packet
- MP4AddRtpPacket(mp4File, hintTrackId, false);
-
- // add the fragment payload header
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, sizeof(payloadHeader));
-
- payloadSize = sizeof(payloadHeader);
- }
- }
- }
-
- // write the hint
- MP4WriteRtpHint(mp4File, hintTrackId, sampleDuration);
-
- // cleanup
- delete [] pDataOffsets;
- delete [] pDataSizes;
-
- return true;
-}
-
-extern "C" bool MP4AV_Rfc3119Hinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- bool interleave,
- u_int16_t maxPayloadSize)
-{
- int rc;
-
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- if (numSamples == 0) {
- return false;
- }
-
- u_int8_t audioType =
- MP4GetTrackEsdsObjectTypeId(mp4File, mediaTrackId);
-
- if (!MP4_IS_MP3_AUDIO_TYPE(audioType)) {
- return false;
- }
-
- MP4Duration sampleDuration =
- MP4AV_GetAudioSampleDuration(mp4File, mediaTrackId);
-
- if (sampleDuration == MP4_INVALID_DURATION) {
- return false;
- }
-
- // choose 500 ms max latency
- MP4Duration maxLatency =
- MP4GetTrackTimeScale(mp4File, mediaTrackId) / 2;
- if (maxLatency == 0) {
- return false;
- }
-
- MP4TrackId hintTrackId =
- MP4AddHintTrack(mp4File, mediaTrackId);
-
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- return false;
- }
-
- doInterleave = interleave;
-
- u_int8_t payloadNumber = MP4_SET_DYNAMIC_PAYLOAD;
-
- MP4SetHintTrackRtpPayload(mp4File, hintTrackId,
- "mpa-robust", &payloadNumber, 0);
-
- // load mp3 frame information into memory
- rc = GetFrameInfo(
- mp4File,
- mediaTrackId,
- &pFrameHeaders,
- &pAduOffsets);
-
- if (!rc) {
- MP4DeleteTrack(mp4File, hintTrackId);
- return false;
- }
-
- if (doInterleave) {
- u_int32_t maxAduSize =
- GetMaxAduSize(mp4File, mediaTrackId);
-
- // compute how many maximum size samples would fit in a packet
- samplesPerPacket =
- maxPayloadSize / (maxAduSize + 2);
-
- // can't interleave if this number is 0 or 1
- if (samplesPerPacket < 2) {
- doInterleave = false;
- }
- }
-
- if (doInterleave) {
- // initial estimate of samplesPerGroup
- samplesPerGroup = maxLatency / sampleDuration;
- // use that to compute an integral stride
- u_int8_t stride = samplesPerGroup / samplesPerPacket;
- // and then recompute samples per group to deal with rounding
- samplesPerGroup = stride * samplesPerPacket;
-
- rc = MP4AV_AudioInterleaveHinter(
- mp4File,
- mediaTrackId,
- hintTrackId,
- sampleDuration,
- samplesPerGroup / samplesPerPacket, // stride
- samplesPerPacket, // bundle
- maxPayloadSize,
- MP4AV_Rfc3119Concatenator);
-
- } else {
- rc = MP4AV_AudioConsecutiveHinter(
- mp4File,
- mediaTrackId,
- hintTrackId,
- sampleDuration,
- 0, // perPacketHeaderSize
- 2, // perSampleHeaderSize
- maxLatency / sampleDuration, // maxSamplesPerPacket
- maxPayloadSize,
- MP4AV_Rfc3119GetAduSize,
- MP4AV_Rfc3119Concatenator,
- MP4AV_Rfc3119Fragmenter);
- }
-
- // cleanup
- free(pFrameHeaders);
- pFrameHeaders = NULL;
- free(pAduOffsets);
- pAduOffsets = NULL;
-
- if (!rc) {
- MP4DeleteTrack(mp4File, hintTrackId);
- return false;
- }
-
- return true;
-}
-
--- a/common/mp4av/rfcisma.cpp
+++ /dev/null
@@ -1,349 +1,0 @@
-/*
- * 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-2002. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie dmackie@cisco.com
- */
-
-/*
- * Notes:
- * - file formatted with tabstops == 4 spaces
- */
-
-#include <mp4av_common.h>
-
-bool MP4AV_RfcIsmaConcatenator(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- u_int8_t samplesThisHint,
- MP4SampleId* pSampleIds,
- MP4Duration hintDuration,
- u_int16_t maxPayloadSize)
-{
- // handle degenerate case
- if (samplesThisHint == 0) {
- return true;
- }
-
- u_int8_t auPayloadHdrSize;
-
- // LATER would be more efficient if this were a parameter
- u_int8_t mpeg4AudioType =
- MP4GetTrackAudioMpeg4Type(mp4File, mediaTrackId);
-
- if (mpeg4AudioType == MP4_MPEG4_CELP_AUDIO_TYPE) {
- auPayloadHdrSize = 1;
- } else {
- auPayloadHdrSize = 2;
- }
-
- // construct the new hint
- MP4AddRtpHint(mp4File, hintTrackId);
- MP4AddRtpPacket(mp4File, hintTrackId, true);
-
- u_int8_t payloadHeader[2];
-
- u_int16_t numHdrBits = samplesThisHint * auPayloadHdrSize * 8;
- payloadHeader[0] = numHdrBits >> 8;
- payloadHeader[1] = numHdrBits & 0xFF;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, sizeof(payloadHeader));
-
- u_int8_t i;
-
- // first the headers
- for (i = 0; i < samplesThisHint; i++) {
- MP4SampleId sampleId = pSampleIds[i];
-
- u_int32_t sampleSize =
- MP4GetSampleSize(mp4File, mediaTrackId, sampleId);
-
- if (auPayloadHdrSize == 1) {
- // AU payload header is 6 bits of size
- // follow by 2 bits of the difference between sampleId's - 1
- payloadHeader[0] = sampleSize << 2;
-
- } else { // auPayloadHdrSize == 2
- // AU payload header is 13 bits of size
- // follow by 3 bits of the difference between sampleId's - 1
- payloadHeader[0] = sampleSize >> 5;
- payloadHeader[1] = (sampleSize & 0x1F) << 3;
- }
-
- if (i > 0) {
- payloadHeader[auPayloadHdrSize - 1]
- |= ((sampleId - pSampleIds[i-1]) - 1);
- }
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, auPayloadHdrSize);
- }
-
- // then the samples
- for (i = 0; i < samplesThisHint; i++) {
- MP4SampleId sampleId = pSampleIds[i];
-
- u_int32_t sampleSize =
- MP4GetSampleSize(mp4File, mediaTrackId, sampleId);
-
- MP4AddRtpSampleData(mp4File, hintTrackId, sampleId, 0, sampleSize);
- }
-
- // write the hint
- MP4WriteRtpHint(mp4File, hintTrackId, hintDuration);
-
- return true;
-}
-
-bool MP4AV_RfcIsmaFragmenter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- u_int32_t sampleSize,
- MP4Duration sampleDuration,
- u_int16_t maxPayloadSize)
-{
- MP4AddRtpHint(mp4File, hintTrackId);
-
- MP4AddRtpPacket(mp4File, hintTrackId, false);
-
- // Note: CELP is never fragmented
- // so we assume the two byte AAC-hbr payload header
- u_int8_t payloadHeader[4];
- payloadHeader[0] = 0;
- payloadHeader[1] = 16;
- payloadHeader[2] = sampleSize >> 5;
- payloadHeader[3] = (sampleSize & 0x1F) << 3;
-
- MP4AddRtpImmediateData(mp4File, hintTrackId,
- (u_int8_t*)&payloadHeader, sizeof(payloadHeader));
-
- u_int16_t sampleOffset = 0;
- u_int16_t fragLength = maxPayloadSize - 4;
-
- do {
- MP4AddRtpSampleData(mp4File, hintTrackId,
- sampleId, sampleOffset, fragLength);
-
- sampleOffset += fragLength;
-
- if (sampleSize - sampleOffset > maxPayloadSize) {
- fragLength = maxPayloadSize;
- MP4AddRtpPacket(mp4File, hintTrackId, false);
- } else {
- fragLength = sampleSize - sampleOffset;
- if (fragLength) {
- MP4AddRtpPacket(mp4File, hintTrackId, true);
- }
- }
- } while (sampleOffset < sampleSize);
-
- MP4WriteRtpHint(mp4File, hintTrackId, sampleDuration);
-
- return true;
-}
-
-extern "C" bool MP4AV_RfcIsmaHinter(
- MP4FileHandle mp4File,
- MP4TrackId mediaTrackId,
- bool interleave,
- u_int16_t maxPayloadSize)
-{
- // gather information, and check for validity
-
- u_int32_t numSamples =
- MP4GetTrackNumberOfSamples(mp4File, mediaTrackId);
-
- if (numSamples == 0) {
- return false;
- }
-
- u_int32_t timeScale =
- MP4GetTrackTimeScale(mp4File, mediaTrackId);
-
- if (timeScale == 0) {
- return false;
- }
-
- u_int8_t audioType =
- MP4GetTrackEsdsObjectTypeId(mp4File, mediaTrackId);
-
- if (audioType != MP4_MPEG4_AUDIO_TYPE
- && !MP4_IS_AAC_AUDIO_TYPE(audioType)) {
- return false;
- }
-
- u_int8_t mpeg4AudioType =
- MP4GetTrackAudioMpeg4Type(mp4File, mediaTrackId);
-
- if (audioType == MP4_MPEG4_AUDIO_TYPE) {
- // check that track contains either MPEG-4 AAC or CELP
- if (!MP4_IS_MPEG4_AAC_AUDIO_TYPE(mpeg4AudioType)
- && mpeg4AudioType != MP4_MPEG4_CELP_AUDIO_TYPE) {
- return false;
- }
- }
-
- MP4Duration sampleDuration =
- MP4AV_GetAudioSampleDuration(mp4File, mediaTrackId);
-
- if (sampleDuration == MP4_INVALID_DURATION) {
- return false;
- }
-
- /* get the ES configuration */
- u_int8_t* pConfig = NULL;
- u_int32_t configSize;
- uint8_t channels;
-
- MP4GetTrackESConfiguration(mp4File, mediaTrackId, &pConfig, &configSize);
-
- if (!pConfig) {
- return false;
- }
-
- channels = MP4AV_AacConfigGetChannels(pConfig);
-
- /* convert ES Config into ASCII form */
- char* sConfig =
- MP4BinaryToBase16(pConfig, configSize);
-
- free(pConfig);
-
- if (!sConfig) {
- return false;
- }
-
- /* create the appropriate SDP attribute */
- char* sdpBuf =
- (char*)malloc(strlen(sConfig) + 256);
-
- if (!sdpBuf) {
- free(sConfig);
- return false;
- }
-
-
- // now add the hint track
- MP4TrackId hintTrackId =
- MP4AddHintTrack(mp4File, mediaTrackId);
-
- if (hintTrackId == MP4_INVALID_TRACK_ID) {
- free(sConfig);
- free(sdpBuf);
- return false;
- }
-
- u_int8_t payloadNumber = MP4_SET_DYNAMIC_PAYLOAD;
- char buffer[10];
- if (channels != 1) {
- snprintf(buffer, sizeof(buffer), "%u", channels);
- }
- MP4SetHintTrackRtpPayload(mp4File, hintTrackId,
- "mpeg4-generic", &payloadNumber, 0,
- channels != 1 ? buffer : NULL);
-
- MP4Duration maxLatency;
-
- if (mpeg4AudioType == MP4_MPEG4_CELP_AUDIO_TYPE) {
- sprintf(sdpBuf,
- "a=fmtp:%u "
- "streamtype=5; profile-level-id=15; mode=CELP-vbr; config=%s; "
- "SizeLength=6; IndexLength=2; IndexDeltaLength=2; Profile=0;"
- "\015\012",
- payloadNumber,
- sConfig);
-
- // 200 ms max latency for ISMA profile 1
- maxLatency = timeScale / 5;
-
- } else { // AAC
- sprintf(sdpBuf,
- "a=fmtp:%u "
- "streamtype=5; profile-level-id=15; mode=AAC-hbr; config=%s; "
- "SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1;"
- "\015\012",
- payloadNumber,
- sConfig);
-
- // 500 ms max latency for ISMA profile 1
- maxLatency = timeScale / 2;
- }
-
- /* add this to the track's sdp */
- MP4AppendHintTrackSdp(mp4File, hintTrackId, sdpBuf);
-
- free(sConfig);
- free(sdpBuf);
-
- u_int32_t samplesPerPacket = 0;
-
- if (interleave) {
- u_int32_t maxSampleSize =
- MP4GetTrackMaxSampleSize(mp4File, mediaTrackId);
-
- // compute how many maximum size samples would fit in a packet
- samplesPerPacket =
- (maxPayloadSize - 2) / (maxSampleSize + 2);
-
- // can't interleave if this number is 0 or 1
- if (samplesPerPacket < 2) {
- interleave = false;
- }
- }
-
- bool rc;
-
- if (interleave) {
- u_int32_t samplesPerGroup = maxLatency / sampleDuration;
-
- rc = MP4AV_AudioInterleaveHinter(
- mp4File,
- mediaTrackId,
- hintTrackId,
- sampleDuration,
- samplesPerGroup / samplesPerPacket, // stride
- samplesPerPacket, // bundle
- maxPayloadSize,
- MP4AV_RfcIsmaConcatenator);
-
- } else {
- rc = MP4AV_AudioConsecutiveHinter(
- mp4File,
- mediaTrackId,
- hintTrackId,
- sampleDuration,
- 2, // perPacketHeaderSize
- 2, // perSampleHeaderSize
- maxLatency / sampleDuration, // maxSamplesPerPacket
- maxPayloadSize,
- MP4GetSampleSize,
- MP4AV_RfcIsmaConcatenator,
- MP4AV_RfcIsmaFragmenter);
- }
-
- if (!rc) {
- MP4DeleteTrack(mp4File, hintTrackId);
- return false;
- }
-
- return true;
-}
-