17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License. 67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at 77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and 147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License. 157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file M4MP4W_Writer.c 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Implementation of the core MP4 writer 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "NXPSW_CompilerSwitches.h" 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_USE_CST_MEMORY_WRITER 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Error.h" 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Debug.h" 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MP4W_Writer.h" 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4MP4W_Utils.h" 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Check optimisation flags : BEGIN */ 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#error "_M4MP4W_OPTIMIZE_FOR_PHONE should not be used with _M4MP4W_MOOV_FIRST" 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_OPTIMIZE_FOR_PHONE 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#error "_M4MP4W_UNBUFFERED_VIDEO should be used with _M4MP4W_OPTIMIZE_FOR_PHONE" 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Check optimisation flags : END */ 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_DONT_USE_TIME_H 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <time.h> 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_DONT_USE_TIME_H*/ 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*MACROS*/ 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define MAJOR_VERSION 3 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define MINOR_VERSION 3 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define REVISION 0 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define ERR_CHECK(exp, err) if (!(exp)) { return err; } 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define CLEANUPonERR(func) if ((err = func) != M4NO_ERROR) goto cleanup 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define max(a,b) (((a) > (b)) ? (a) : (b)) 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/***************/ 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*Static blocks*/ 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/***************/ 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*CommonBlocks*/ 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar Default_ftyp [] = 727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x18, 'f', 't', 'y', 'p', '3', 'g', 'p', '7', 0x00, 0x00, 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x03, 0x00, '3', 'g', 'p', '7', 'i', 's', 'o', 'm' 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock2 [] = 787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'm', 'd', 'a', 't' 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock3 [] = 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'm', 'o', 'o', 'v', 0x00, 0x00, 0x00, 0x6C, 'm', 'v', 'h', 'd', 0x00, 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock4 [] = 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x03, 0xE8 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock5 [] = 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock6 [] = 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 't', 'r', 'a', 'k', 0x00, 0x00, 0x00, 0x5C, 't', 'k', 'h', 'd', 0x00, 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x01 1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock7 [] = 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock7bis [] = 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x40, 0x00, 0x00, 0x00 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock8 [] = 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'm', 'd', 'i', 'a', 0x00, 0x00, 0x00, 0x20, 'm', 'd', 'h', 'd', 0x00, 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock9 [] = 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x55, 0xC4, 0x00, 0x00 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock10 [] = 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'm', 'i', 'n', 'f', 0x00, 0x00, 0x00, 0x24, 'd', 'i', 'n', 'f', 0x00, 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x1C, 'd', 'r', 'e', 'f', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 'u', 'r', 'l', ' ', 0x00, 0x00, 0x00, 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x01 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock11 [] = 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 'b', 'l' 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock12 [] = 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 't', 's', 0x00, 0x00, 0x00, 0x00 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar SampleDescriptionHeader [] = 1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 's', 'd', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar SampleDescriptionEntryStart [] = 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock15 [] = 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 's', 'z', 0x00, 0x00, 0x00, 0x00 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock16 [] = 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 's', 'c', 0x00, 0x00, 0x00, 0x00 1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar CommonBlock17 [] = 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 'c', 'o', 0x00, 0x00, 0x00, 0x00 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar BlockSignatureSkipHeader [] = 1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x5E, 's', 'k', 'i', 'p' 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* due to current limitations, size must be 16 */ 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar BlockSignatureSkipDefaultEmbeddedString [] = 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'N', 'X', 'P', 'S', 'W', ' ', 'C', 'A', 'M', 'C', 'O', 'R', 'D', 'E', 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'R', ' ' 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* follows the version (like " 3.0.2"), then " -- " */ 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* due to current limitations, size must be 60 */ 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar BlockSignatureSkipDefaultIntegrationTag [] = 1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*VideoBlocks*/ 1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 320*240, now no longer hardcoded */ 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* const M4OSA_UChar VideoBlock1[] = 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 0x01, 0x40, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00 }; */ 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar VideoBlock1_1 [] = 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x21, 'h', 'd', 'l', 'r', 0x00, 0x00, 0x00, 0x00, 0x00, 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 'v', 'i', 'd', 'e', 0x00, 0x00, 0x00, 0x00, 0x00, 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar SampleDescriptionEntryVideoBoilerplate1 [] = 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar SampleDescriptionEntryVideoBoilerplate2 [] = 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar VideoBlock4 [] = 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 't', 's', 's', 0x00, 0x00, 0x00, 0x00 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; /*STSS*/ 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar VideoBlock5 [] = 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x14, 'v', 'm', 'h', 'd', 0x00, 0x00, 0x00, 0x00, 0x00, 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar VideoResolutions [] = 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*Mp4vBlocks*/ 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar Mp4vBlock1 [] = 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'm', 'p', '4', 'v' 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar Mp4vBlock3 [] = 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x20, 0x11 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*H263Blocks*/ 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H263Block1 [] = 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', '2', '6', '3' 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H263Block2 [] = 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x0F, 'd', '2', '6', '3' 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H263Block2_bitr [] = 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x1F, 'd', '2', '6', '3' 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H263Block3 [] = 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'P', 'H', 'L', 'P', 0x00, 0x0A, 0x00 2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H263Block4 [] = 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x10, 'b', 'i', 't', 'r' 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*H264Blocks*/ 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H264Block1 [] = 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'a', 'v', 'c', '1' 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Store the avcC field, the version (=1), 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi the profile (=66), the compatibility (=0), */ 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* the level (=10),111111 + NAL field Size (= 4 - 1), 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 111 + number of PPS (=1) */ 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar H264Block2 [] = 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Remove the hardcoded DSI values of H264Block2 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'a' , 'v' , 'c' , 'C' 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*AMRBlocks*/ 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AMRBlock1 [] = 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AMRBlock1_1 [] = 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x21, 'h', 'd', 'l', 'r', 0x00, 0x00, 0x00, 0x00, 0x00, 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 's', 'o', 'u', 'n', 0x00, 0x00, 0x00, 0x00, 0x00, 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AudioSampleDescEntryBoilerplate [] = 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AMRDSIHeader [] = 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x11, 'd', 'a', 'm', 'r' 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AMRDefaultDSI [] = 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'P', 'H', 'L', 'P', 0x00, 0x00, 0x80, 0x00, 0x01 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AMRBlock4 [] = 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x10, 's', 'm', 'h', 'd', 0x00, 0x00, 0x00, 0x00, 0x00, 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*AMR8Blocks*/ 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AMR8Block1 [] = 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 'a', 'm', 'r' 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*AMR16Blocks*/ 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*const M4OSA_UChar AMR16Block1[] = { 's', 'a', 'w', 'b'};*/ 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*AACBlocks*/ 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AACBlock1 [] = 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'm', 'p', '4', 'a' 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar AACBlock2 [] = 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x40, 0x15 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*MPEGConfigBlocks (AAC & MP4V)*/ 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar MPEGConfigBlock0 [] = 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'e', 's', 'd', 's', 0x00, 0x00, 0x00, 0x00, 0x03 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar MPEGConfigBlock1 [] = 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x04 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar MPEGConfigBlock2 [] = { 0x05 }; 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar MPEGConfigBlock3 [] = 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x06, 0x01, 0x02 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*EVRCBlocks*/ 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar EVRCBlock3_1 [] = 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0x00, 0x00, 0x00, 0x0E, 'd', 'e', 'v', 'c' 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar EVRCBlock3_2 [] = 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 'P', 'H', 'L', 'P', 0x00, 0x00 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*EVRC8Blocks*/ 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst M4OSA_UChar EVRC8Block1 [] = 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 's', 'e', 'v', 'c' 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}; 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/***********/ 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Methods */ 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/***********/ 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_getVersion(M4OSA_UInt8 *major, M4OSA_UInt8 *minor, 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 *revision ) 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != major, M4ERR_PARAMETER); 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != minor, M4ERR_PARAMETER); 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != revision, M4ERR_PARAMETER); 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *major = MAJOR_VERSION; 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *minor = MINOR_VERSION; 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *revision = REVISION; 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_STTS_ALLOC_SIZE; 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_STSZ_ALLOC_SIZE; 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_STSS_ALLOC_SIZE; 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_CHUNK_ALLOC_NB; 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_STTS_AUDIO_ALLOC_SIZE; 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_STSZ_AUDIO_ALLOC_SIZE; 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic M4OSA_UInt32 M4MP4W_CHUNK_AUDIO_ALLOC_NB; 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* stsc[ ] table is splitted at 12 bits */ 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4MP4W_VIDEO_MAX_AU_PER_CHUNK 4095 /* 0=notused */ 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4MP4W_VIDEO_MAX_AU_PER_CHUNK 10 /* 0=notused */ 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_initializeAllocationParameters(M4MP4W_Mp4FileData *Ptr ) 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 maxMemory, vesMemory; 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 nbVideoFrames, nbAudioFrames; 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 averageVideoChunk; 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*-----------*/ 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* NB_FRAMES */ 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*-----------*/ 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* magical formula : memory = vesMemory + 12 * framerate * duration */ 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi vesMemory = 0x32000; /* 200 kB */ 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi vesMemory = 0x3E800; /* 250 kB */ 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define VIDEO_POOL_MEMORY 1000000 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi maxMemory = VIDEO_POOL_MEMORY; 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (maxMemory < vesMemory) { 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbVideoFrames = ( maxMemory - vesMemory) / 12; 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4MP4W: %d images max", nbVideoFrames); 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* VIDEO */ 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* assume an average of 25 fpc : reference = 15 fps * 2s * 0.8 */ 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi averageVideoChunk = 2500; 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4MP4W_VIDEO_MAX_AU_PER_CHUNK > 0) 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi averageVideoChunk = 100 * M4MP4W_VIDEO_MAX_AU_PER_CHUNK - 20 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (M4MP4W_VIDEO_MAX_AU_PER_CHUNK - 1); /* margin 20% */ 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* assume an average of 50 fpc */ 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi averageVideoChunk = 5000; 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STTS_ALLOC_SIZE = nbVideoFrames * sizeof(M4OSA_UInt32); 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STSZ_ALLOC_SIZE = nbVideoFrames * sizeof(M4OSA_UInt16); 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STSS_ALLOC_SIZE = nbVideoFrames * sizeof( 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32); /* very conservative (all images are intra) */ 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_CHUNK_ALLOC_NB = ( nbVideoFrames * 100) / averageVideoChunk + 1; 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AUDIO */ 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbAudioFrames = nbVideoFrames; 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* audio is 5 fps, which is the smallest framerate for video */ 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STTS_AUDIO_ALLOC_SIZE = 100; /* compressed */ 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STSZ_AUDIO_ALLOC_SIZE = 100; /* compressed */ 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_CHUNK_AUDIO_ALLOC_NB = nbAudioFrames / 10 + 1; 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_CHUNK_AUDIO_ALLOC_NB = nbAudioFrames / 38 + 1; 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* VIDEO 5 min at 25 fps null-enc */ 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STTS_ALLOC_SIZE = 20000; 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STSZ_ALLOC_SIZE = 18000; 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STSS_ALLOC_SIZE = 5000; 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_CHUNK_ALLOC_NB = 500; 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* AUDIO 2 min aac+ null-enc */ 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STTS_AUDIO_ALLOC_SIZE = 32000; 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_STSZ_AUDIO_ALLOC_SIZE = 20000; 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_CHUNK_AUDIO_ALLOC_NB = 1000; 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_openWrite(M4OSA_Context *contextPtr, 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi void *outputFileDescriptor, 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FileWriterPointer *fileWriterFunction, 5337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi void *tempFileDescriptor, 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FileReadPointer *fileReaderFunction ) 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = M4OSA_NULL; 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != contextPtr, M4ERR_PARAMETER); 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != outputFileDescriptor, M4ERR_PARAMETER); 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != fileWriterFunction, M4ERR_PARAMETER); 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Optional, feature won't be used if NULL */ 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1("tempFileDescriptor = %p", tempFileDescriptor); 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == tempFileDescriptor) 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "tempFileDescriptor is NULL, RESERVED_MOOV_DISK_SPACE feature not used"); 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */ 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Not used : ERR_CHECK(M4OSA_NULL != tempFileDescriptor, M4ERR_PARAMETER); */ 5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */ 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Not used : ERR_CHECK(M4OSA_NULL != fileReaderFunction, M4ERR_PARAMETER); */ 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* The context reuse mode was suppressed*/ 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr = 562694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4MP4W_Mp4FileData *)M4OSA_32bitAlignedMalloc(sizeof(M4MP4W_Mp4FileData), 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"MP4 writer context"); 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr != M4OSA_NULL, M4ERR_ALLOC); 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->url = outputFileDescriptor; 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr = M4OSA_NULL; 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr = M4OSA_NULL; 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxChunkSize = M4MP4W_DefaultMaxChunkSize; /*default */ 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxAUSize = M4MP4W_DefaultMaxAuSize; /*default */ 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->InterleaveDur = 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_DefaultInterleaveDur; /*default = 0, i.e. not used*/ 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxFileSize = 0; /*default = 0, i.e. not used*/ 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->camcoderVersion = 0; /*default is " 0.0.0"*/ 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->embeddedString = 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL; /*default is in BlockSignatureSkipDefaultEmbeddedString */ 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->integrationTag = M4OSA_NULL; /*default is 0 */ 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxFileDuration = 0; /*default = 0, i.e. not used*/ 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions = fileWriterFunction; 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->hasAudio = M4OSA_FALSE; 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->hasVideo = M4OSA_FALSE; 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->state = M4MP4W_opened; 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->duration = 0; /*i*/ 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*patch for integrationTag 174 -> 238 (+64)*/ 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize = 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 238; /*initialization with constant part in ftyp+mdat+moov+skip*/ 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->estimateAudioSize = M4OSA_FALSE; 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioMsChunkDur = 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*set and used only when estimateAudioSize is true*/ 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioMsStopTime = 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*set and used only when estimateAudioSize is true*/ 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext = M4OSA_NULL; 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* + CRLV6775 -H.264 trimming */ 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->bMULPPSSPS = M4OSA_FALSE; 5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* - CRLV6775 -H.264 trimming */ 5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos = 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32; /*init with ftyp + beginning of mdat size*/ 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->safetyFileUrl = tempFileDescriptor; 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->cleanSafetyFile = 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FALSE; /* No need to clean it just yet. */ 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */ 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ftyp atom */ 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 61632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *) &mMp4FileDataPtr->ftyp,0, 61732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu sizeof(mMp4FileDataPtr->ftyp)); 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *contextPtr = mMp4FileDataPtr; 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_initializeAllocationParameters(mMp4FileDataPtr); 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_addStream(M4OSA_Context context, 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamDescription *streamDescPtr ) 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(M4OSA_NULL != context, M4ERR_PARAMETER); 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(( mMp4FileDataPtr->state == M4MP4W_opened) 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (mMp4FileDataPtr->state == M4MP4W_ready), M4ERR_STATE); 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->state = M4MP4W_ready; 6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch (streamDescPtr->streamType) 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kAMR: 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kAAC: 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kEVRC: 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Audio*/ 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->streamID == AudioStreamID, 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check if an audio track has already been added*/ 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->hasAudio == M4OSA_FALSE, 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_BAD_CONTEXT); 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check if alloc need to be done*/ 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr == M4OSA_NULL) 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr = (M4MP4W_AudioTrackData 658694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(sizeof(M4MP4W_AudioTrackData), 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"M4MP4W_AudioTrackData"); 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr != M4OSA_NULL, 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We must init these pointers in case an alloc bellow fails */ 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->Chunk = M4OSA_NULL; 6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable = M4OSA_NULL; 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable = M4OSA_NULL; 6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable = M4OSA_NULL; 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable = M4OSA_NULL; 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS = M4OSA_NULL; 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ = M4OSA_NULL; 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI = M4OSA_NULL; 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*now dynamic*/ 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->Chunk = 679694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar ** )M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_AUDIO_ALLOC_NB 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UChar *), 6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->Chunk"); 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->Chunk != M4OSA_NULL, 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->Chunk = 688694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar ** )M4OSA_32bitAlignedMalloc(sizeof(M4OSA_UChar *), 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->Chunk"); 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->Chunk != M4OSA_NULL, 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->Chunk[0] = M4OSA_NULL; 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable = 695694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_AUDIO_ALLOC_NB 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->chunkOffsetTable"); 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS = 704694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_STTS_AUDIO_ALLOC_SIZE, 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->TABLE_STTS"); 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->TABLE_STTS 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedSttsBlocks = 1; 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable = 711694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_AUDIO_ALLOC_NB 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->chunkSizeTable"); 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkSizeTable 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable = 717694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_AUDIO_ALLOC_NB 7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->chunkSampleNbTable"); 7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable 7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable = 723694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_AUDIO_ALLOC_NB 7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->chunkTimeMsTable"); 7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable 7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk = 0; 7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->hasAudio = M4OSA_TRUE; 7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 402; 7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxChunkSize = 7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxChunkSize; /* init value */ 7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxAUSize = 7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxAUSize; 7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS = 0; 7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb = 0; 7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize = 0; 7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb = 1; 7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.timescale = 7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->timeScale; 7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable[0] = 0; /*init*/ 7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable[0] = 0; /*init*/ 7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable[0] = 0; /*init*/ 7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentChunk = 7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*1st chunk is Chunk[0]*/ 7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos = 0; 7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentStsc = 0; 7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->microState = M4MP4W_ready; 7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedStszBlocks = 0; 7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ = M4OSA_NULL; 7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->avgBitrate = 7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->averageBitrate; 7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->maxBitrate = 7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->maxBitrate; 7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamDescPtr->streamType == M4SYS_kAMR) 7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.trackType = 7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_kAMR; 7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->timeScale == 8000, M4ERR_PARAMETER); 7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->sampleDuration = 7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 160; /*AMR8+timescale=8000 => sample duration 160 constant*/ 7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Use given DSI if passed, else use default value*/ 7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamDescPtr->decoderSpecificInfoSize != 0) 7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*amr DSI is 9 bytes long !*/ 7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->dsiSize = 7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9; /*always 9 for amr*/ 7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->decoderSpecificInfoSize == 9, 7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI = 782694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc(9, M4MP4_WRITER, 7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"audioTrackPtr->DSI"); 7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL, 7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 78632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 78732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->audioTrackPtr->DSI, 78832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamDescPtr->decoderSpecificInfo, 7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9); 7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI = 7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL; /*default static block will be used*/ 7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->dsiSize = 7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*but the actual static dsi is 9 bytes !*/ 7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (streamDescPtr->streamType == M4SYS_kEVRC) 8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.trackType = 8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_kEVRC; 8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->timeScale == 8000, M4ERR_PARAMETER); 8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->sampleDuration = 8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 160; /*EVRC+timescale=8000 => sample duration 160 constant*/ 8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Use given DSI if passed, else use default value*/ 8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamDescPtr->decoderSpecificInfoSize != 0) 8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*evrc DSI is 6 bytes long !*/ 8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->dsiSize = 8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6; /*always 6 for evrc*/ 8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->decoderSpecificInfoSize == 6, 8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI = 817694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc(6, M4MP4_WRITER, 8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"audioTrackPtr->DSI"); 8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL, 8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 82132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 82232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->audioTrackPtr->DSI, 82332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamDescPtr->decoderSpecificInfo, 8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6); 8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI = 8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL; /*default static block will be used*/ 8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->dsiSize = 8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*but the actual static dsi is 6 bytes !*/ 8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /*M4SYS_kAAC*/ 8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*avg bitrate should be set*/ 8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->averageBitrate != -1, M4ERR_PARAMETER); 8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->maxBitrate != -1, M4ERR_PARAMETER); 8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.trackType = 8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_kAAC; 8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->sampleDuration = 8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*don't know for aac, so set 0*/ 8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->dsiSize = 8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamDescPtr->decoderSpecificInfoSize; 8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->dsiSize != 0) 8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI = 851694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc( 8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize, 8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->DSI"); 8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL, 8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 85632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 85732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->audioTrackPtr->DSI, 85832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamDescPtr->decoderSpecificInfo, 8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize); 8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*no dsi: return bad parameter ?*/ 8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4SYS_kMPEG_4): 8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4SYS_kH264): 8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4SYS_kH263): 8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Video*/ 8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->streamID == VideoStreamID, 8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check if a video track has already been added*/ 8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->hasVideo == M4OSA_FALSE, 8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_BAD_CONTEXT); 8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check if alloc need to be done*/ 8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr == M4OSA_NULL) 8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr = (M4MP4W_VideoTrackData 885694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(sizeof(M4MP4W_VideoTrackData), 8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"M4MP4W_VideoTrackData"); 8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr != M4OSA_NULL, 8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We must init these pointers in case an alloc bellow fails */ 8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->Chunk = M4OSA_NULL; 8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable = M4OSA_NULL; 8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable = M4OSA_NULL; 8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable = M4OSA_NULL; 8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable = M4OSA_NULL; 8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS = M4OSA_NULL; 8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ = M4OSA_NULL; 8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSS = M4OSA_NULL; 9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = M4OSA_NULL; 9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*now dynamic*/ 9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->Chunk = 907694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar ** )M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_ALLOC_NB 9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UChar *), 9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->Chunk"); 9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->Chunk != M4OSA_NULL, 9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*re-use the same chunk and flush it when full*/ 9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->Chunk = 917694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar ** )M4OSA_32bitAlignedMalloc(sizeof(M4OSA_UChar *), 9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->Chunk"); 9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->Chunk != M4OSA_NULL, 9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->Chunk[0] = M4OSA_NULL; 9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable = 924694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_ALLOC_NB 9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->chunkOffsetTable"); 9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable 9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->Chunk != M4OSA_NULL, 9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable = 935694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_ALLOC_NB 9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->chunkSizeTable"); 9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkSizeTable 9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable = 941694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_ALLOC_NB 9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->chunkSampleNbTable"); 9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable 9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable = 947694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4MP4W_Time32 *)M4OSA_32bitAlignedMalloc(M4MP4W_CHUNK_ALLOC_NB 9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4MP4W_Time32), 9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->chunkTimeMsTable"); 9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable 9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk = 0; 9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*tables are now dynamic*/ 9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS = 956694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_STTS_ALLOC_SIZE, 9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->TABLE_STTS"); 9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->TABLE_STTS 9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedSttsBlocks = 1; 9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ = 964694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt16 *)M4OSA_32bitAlignedMalloc(M4MP4W_STSZ_ALLOC_SIZE, 9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->TABLE_STSZ"); 9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ = 970694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_STSZ_ALLOC_SIZE, 9717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->TABLE_STSZ"); 9727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 9747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ 9767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStszBlocks = 1; 9787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSS = 979694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc(M4MP4W_STSS_ALLOC_SIZE, 9807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->TABLE_STSS"); 9817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->TABLE_STSS 9827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 9837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStssBlocks = 1; 9847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->hasVideo = M4OSA_TRUE; 9867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 462; 9877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->width = M4MP4W_DefaultWidth; 9887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->height = M4MP4W_DefaultHeight; 9897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxAUSize = 9907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxAUSize; 9917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.trackType = 9927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->streamType; 9937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxChunkSize = 9947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxChunkSize; /* init value */ 9957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 9967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxAUperChunk = 9987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_VIDEO_MAX_AU_PER_CHUNK; 9997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 10017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->timeScale == 1000, M4ERR_PARAMETER); 10037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.timescale = 1000; 10047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS = 0; 10057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb = 0; 10067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleSize = 0; 10077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb = 1; 10087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable[0] = 0; /*init*/ 10097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable[0] = 0; /*init*/ 10107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable[0] = 0; /*init*/ 10117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk = 10127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*1st chunk is Chunk[0]*/ 10137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos = 0; 10147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 10157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentStsc = 0; 10177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 10197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb = 0; 10217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->microState = M4MP4W_ready; 10227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamDescPtr->streamType == M4SYS_kH263) 10247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( streamDescPtr->averageBitrate == -1) 10267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (streamDescPtr->maxBitrate == -1)) 10277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*the bitrate will not be written if the bitrate information 10297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi is not fully set */ 10307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->avgBitrate = -1; 10317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->maxBitrate = -1; 10327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 10347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*proprietary storage of h263 bitrate. 10367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Warning: not the actual bitrate (bit set to 1).*/ 10377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->avgBitrate = 10387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->averageBitrate; 10397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->maxBitrate = 10407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->maxBitrate; 10417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( 0 != streamDescPtr->decoderSpecificInfoSize) 10447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4OSA_NULL != streamDescPtr->decoderSpecificInfo)) 10457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*decoder specific info size is supposed to be always 7 bytes long */ 10477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->decoderSpecificInfoSize == 7, 10487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 10497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 10507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamDescPtr->decoderSpecificInfoSize; 10517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = 1052694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc( 10537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize, 10547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 10557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI != M4OSA_NULL, 10567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 105732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 105832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr->DSI, 105932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamDescPtr->decoderSpecificInfo, 10607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize); 10617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 10637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*use the default dsi*/ 10657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = M4OSA_NULL; 10667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 0; 10677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 10707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamDescPtr->streamType == M4SYS_kMPEG_4) 10717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 22; /*extra bytes (from h263)*/ 10737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* allow DSI to be M4OSA_NULL, in which case the actual DSI will be 10747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi set by setOption. */ 10757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( 0 == streamDescPtr->decoderSpecificInfoSize) 10767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == streamDescPtr->decoderSpecificInfo)) 10777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = M4OSA_NULL; 10797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 0; 10807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 10817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 10827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 10837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*MP4V specific*/ 10847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*decoder specific info size is supposed to be always < 10857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 105 so that ESD size can be coded with 1 byte*/ 10867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*(this should not be restrictive because dsi is always shorter !)*/ 10877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->decoderSpecificInfoSize < 105, 10887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 10897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 10907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamDescPtr->decoderSpecificInfoSize; 10917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = 1092694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc( 10937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize, 10947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 10957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI != M4OSA_NULL, 10967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 109732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 109832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr->DSI, 109932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamDescPtr->decoderSpecificInfo, 11007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize); 11017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 11027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize; 11037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*avg bitrate should be set*/ 11057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamDescPtr->averageBitrate != -1, M4ERR_PARAMETER); 11067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->avgBitrate = 11077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->averageBitrate; 11087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->maxBitrate = 11097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->averageBitrate; 11107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamDescPtr->streamType == M4SYS_kH264) 11137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* H264 specific information */ 11157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->avgBitrate = 11167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->averageBitrate; 11177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->maxBitrate = 11187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->maxBitrate; 11197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0 != streamDescPtr->decoderSpecificInfoSize) 11217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (M4OSA_NULL != streamDescPtr->decoderSpecificInfo)) 11227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* + H.264 trimming */ 11247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_TRUE == mMp4FileDataPtr->bMULPPSSPS) 11257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 SPSLength, PPSLength; 11277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 *DSI; 11287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Store the DSI size */ 11297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 11307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamDescPtr->decoderSpecificInfoSize 11317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 24; 11327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Copy the DSI (SPS + PPS) */ 11347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = 1135694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc( 11367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize, 11377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 11387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI 11397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 11407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi DSI = 11427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16 *)streamDescPtr->decoderSpecificInfo; 11437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi SPSLength = DSI[6]; 11447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi PPSLength = DSI[10]; 114532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 114632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr->DSI, 114732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((streamDescPtr-> 114832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu decoderSpecificInfo)+12), 2); 114932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 115032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((mMp4FileDataPtr->videoTrackPtr-> 115132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu DSI)+2), (void *)((streamDescPtr-> 115232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu decoderSpecificInfo)+28), SPSLength); 115332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu 115432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 115532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((mMp4FileDataPtr->videoTrackPtr-> 115632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu DSI)+2 + SPSLength), 115732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((streamDescPtr-> 115832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu decoderSpecificInfo)+20), 2); 115932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 116032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((mMp4FileDataPtr->videoTrackPtr-> 116132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu DSI)+4 + SPSLength), 116232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)((streamDescPtr-> 116332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu decoderSpecificInfo)+28 + SPSLength), 11647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi PPSLength); 11657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* - H.264 trimming */ 11667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 11687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Store the DSI size */ 11707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 11717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamDescPtr->decoderSpecificInfoSize; 11727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Copy the DSI (SPS + PPS) */ 11747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = 1175694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc( 11767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize, 11777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 11787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI 11797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 118032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 118132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr->DSI, 118232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamDescPtr-> 11837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi decoderSpecificInfo, 11847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamDescPtr->decoderSpecificInfoSize); 11857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 11887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 11897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*use the default dsi*/ 11907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = M4OSA_NULL; 11917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 0; 11927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 11957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 11967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 11977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4ERR_PARAMETER; 11987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 11997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 12017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 12027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 12047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_startWriting( M4OSA_Context context ) 12057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 12067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 12077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 12087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 fileModeAccess = M4OSA_kFileWrite | M4OSA_kFileCreate; 12097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 i; 12107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 12117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 12127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->state == M4MP4W_ready), M4ERR_STATE); 12147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->state = M4MP4W_writing; 12157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*audio microstate */ 12177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* if (mMp4FileDataPtr->audioTrackPtr != M4OSA_NULL)*/ 12187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio) 12197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->audioTrackPtr->microState == M4MP4W_ready), 12217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_STATE); 12227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->microState = M4MP4W_writing; 12237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* First audio chunk allocation */ 12257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->Chunk[0] = (M4OSA_UChar 1226694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(mMp4FileDataPtr->audioTrackPtr->MaxChunkSize, 12277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->Chunk[0]"); 12287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->Chunk[0] != M4OSA_NULL, 12297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 12307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*video microstate*/ 12337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* if (mMp4FileDataPtr->videoTrackPtr != M4OSA_NULL)*/ 12347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo) 12357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->videoTrackPtr->microState == M4MP4W_ready), 12377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_STATE); 12387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->microState = M4MP4W_writing; 12397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* First video chunk allocation */ 12417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->Chunk[0] = (M4OSA_UChar 1242694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(mMp4FileDataPtr->videoTrackPtr->MaxChunkSize, 12437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->Chunk[0]"); 12447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->Chunk[0] != M4OSA_NULL, 12457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 12467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->estimateAudioSize == M4OSA_TRUE) 12497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*set audioMsChunkDur (duration in ms before a new chunk is created) 12517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for audio size estimation*/ 12527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->hasVideo, M4ERR_BAD_CONTEXT); 12537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->hasAudio, M4ERR_BAD_CONTEXT); 12547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioMsChunkDur = 12567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20 * mMp4FileDataPtr->audioTrackPtr->MaxChunkSize 12577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / mMp4FileDataPtr->audioTrackPtr->MaxAUSize; 12587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( mMp4FileDataPtr->InterleaveDur != 0) 12607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->InterleaveDur 12617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi < 20 *mMp4FileDataPtr->audioTrackPtr->MaxChunkSize 12627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / mMp4FileDataPtr->audioTrackPtr->MaxAUSize)) 12637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioMsChunkDur = mMp4FileDataPtr->InterleaveDur; 12657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 12677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 12697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*open file in write binary mode*/ 12717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->openWrite( 12737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &mMp4FileDataPtr->fileWriterContext, 12747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->url, fileModeAccess); 12757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 12767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*ftyp atom*/ 12787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->ftyp.major_brand != 0) 12797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 12807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put customized ftyp box */ 12817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = 12827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(16 + (mMp4FileDataPtr->ftyp.nbCompatibleBrands * 4), 12837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 12847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 12857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 12867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBE32(M4MPAC_FTYP_TAG, 12877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 12887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 12897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 12907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBE32(mMp4FileDataPtr->ftyp.major_brand, 12917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 12927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 12937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 12947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBE32(mMp4FileDataPtr->ftyp.minor_version, 12957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 12967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 12977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 12987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 12997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i < mMp4FileDataPtr->ftyp.nbCompatibleBrands; i++ ) 13007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBE32(mMp4FileDataPtr->ftyp.compatible_brands[i], 13027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 13037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 13047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 13057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 13087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put default ftyp box */ 13107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock(Default_ftyp, sizeof(Default_ftyp), 13117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 13127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 13137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 13147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*init mdat value with 0 but the right value is set just before the file is closed*/ 13177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBE32(0, mMp4FileDataPtr->fileWriterFunctions, 13187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 13197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 13207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock(CommonBlock2, sizeof(CommonBlock2), 13217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 13227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 13237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 13247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 13267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE 13287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (0 != mMp4FileDataPtr->MaxFileSize 13307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && M4OSA_NULL != mMp4FileDataPtr->safetyFileUrl) 13317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err2 = M4NO_ERROR; 13337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context safetyFileContext = M4OSA_NULL; 13347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 safetyFileSize = 0, addendum = 0; 13357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UChar dummyData[100]; /* To fill the safety file with */ 13367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = 13387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->openWrite(&safetyFileContext, 13397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->safetyFileUrl, fileModeAccess); 13407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err), err); 13417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->cleanSafetyFile = M4OSA_TRUE; 13437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 10% seems to be a reasonable worst case, but also provision for 1kb of moov overhead.*/ 13457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi safetyFileSize = 1000 + (mMp4FileDataPtr->MaxFileSize * 10 + 99) / 100; 13467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Here we add space to take into account the fact we have to flush any pending 13487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunk in closeWrite, this space is the sum of the maximum chunk sizes, for each 13497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi track. */ 13507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_UNBUFFERED_VIDEO 13527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo) 13547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi safetyFileSize += mMp4FileDataPtr->videoTrackPtr->MaxChunkSize; 13567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 13597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio) 13617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi safetyFileSize += mMp4FileDataPtr->audioTrackPtr->MaxChunkSize; 13637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 136532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memset((void *)dummyData, 0xCA,sizeof(dummyData)); /* For extra safety. */ 13667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; 13687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i < (safetyFileSize + sizeof(dummyData) - 1) / sizeof(dummyData); 13697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++ ) 13707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->writeData( 13727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi safetyFileContext, dummyData, sizeof(dummyData)); 13737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 13757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 13767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Don't return from the function yet, as we need to close the file first. */ 13777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* I don't need to keep it open. */ 13807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = 13817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->closeWrite(safetyFileContext); 13827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 13847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 13857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 13867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 13887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((M4NO_ERROR == err2), err2); 13897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("Safety file correctly created"); 13917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 13927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */ 13937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 13957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 13967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 13977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 13987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_newAudioChunk( M4OSA_Context context, 13997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *leftSpaceInChunk ) 14007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 14017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 14027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 14037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 14057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_audio; 14067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_OPTIMIZE_FOR_PHONE 14087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 reallocNb; 14107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 14127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* video only */ 14147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr == M4OSA_NULL) 14167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 14177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0(" M4MP4W_newAudioChunk - flush audio"); 14197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_2("current chunk = %d offset = 0x%x", 14207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentChunk, 14217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos); 14227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_audio = 1000.0 / mMp4FileDataPtr->audioTrackPtr->CommonData.timescale; 14247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 14267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*flush chunk*/ 14277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock(mMp4FileDataPtr->audioTrackPtr->Chunk[0], 14297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos, 14307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 14317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 14327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 14347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition temp = mMp4FileDataPtr->absoluteCurrentPos; 14367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1( 14377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_newAudioChunk: putBlock error when flushing chunk: %#X", 14387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 14397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Ouch, we got an error writing to the file, but we need to properly react so that the 14407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi state is still consistent and we can properly close the file so that what has been 14417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi recorded so far is not lost. Yay error recovery! */ 14427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* First, we do not know where we are in the file. Put us back at where we were before 14447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi attempting to write the data. That way, we're consistent with the chunk state data. */ 14457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->seek( 14467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext, 14477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &temp); 14487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3( 14507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Backtracking to position 0x%08X, seek returned %d and position %08X", 14517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos, err, temp); 14527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Then, do not update any info whatsoever in the writing state. This will have the 14547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi consequence that it will be as if the chunk has not been flushed yet, and therefore 14557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi it will be done as part of closeWrite (where there could be room to do so, 14567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if some emergency room is freed for that purpose). */ 14577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* And lastly (for here), return that we've reached the limit of available space. */ 14597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 14617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 14627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update chunk offset*/ 14647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 14657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkOffsetTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 14667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos; 14677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*add chunk size to absoluteCurrentPos*/ 14697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos += 14707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos; 14717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 14737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update chunk info */ 14757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 14777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSizeTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 14787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos; 14797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 14807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 14817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS; 14827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentChunk += 1; 14847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if audio amount of data is not estimated*/ 14857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->estimateAudioSize == M4OSA_FALSE) 14867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 16; 14877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*alloc new chunk*/ 14897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*only if not already allocated*/ 14907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->currentChunk 14917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk) 14927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 14937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update LastAllocatedChunk ( -> = currentChunk)*/ 14947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk += 1; 14957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*max nb of chunk is now dynamic*/ 14977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 14987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 14997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk 15007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 3 > M4MP4W_CHUNK_AUDIO_ALLOC_NB) 15017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_newAudioChunk : audio chunk table is full"); 15037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 15047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 15077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (((mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk) 15097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi % M4MP4W_CHUNK_AUDIO_ALLOC_NB) == 0) 15107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb = mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk 15127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + M4MP4W_CHUNK_AUDIO_ALLOC_NB; 15137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 15157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->Chunk = 15177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UChar ** )M4MP4W_realloc( 15187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr->Chunk, 15197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( reallocNb - M4MP4W_CHUNK_AUDIO_ALLOC_NB) 15207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UChar *), 15217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UChar *)); 15227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->Chunk != M4OSA_NULL, 15237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 15247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 15267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable = 15287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 15297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr-> 15307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkOffsetTable, 15317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( reallocNb - M4MP4W_CHUNK_AUDIO_ALLOC_NB) 15327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 15337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UInt32)); 15347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable 15357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 15367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 15387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable = 15407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 15417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr-> 15427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSizeTable, 15437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( reallocNb - M4MP4W_CHUNK_AUDIO_ALLOC_NB) 15447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 15457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UInt32)); 15467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkSizeTable 15477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 15487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable = 15507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 15517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr-> 15527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable, 15537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( reallocNb - M4MP4W_CHUNK_AUDIO_ALLOC_NB) 15547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 15557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UInt32)); 15567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable 15577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 15587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable = 15607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4MP4W_Time32 *)M4MP4W_realloc( 15617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr-> 15627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable, 15637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( reallocNb - M4MP4W_CHUNK_AUDIO_ALLOC_NB) 15647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4MP4W_Time32), 15657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4MP4W_Time32)); 15667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable 15677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 15687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 15707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 15727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 15747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->audioTrackPtr->currentChunk] = (M4OSA_UChar 1575694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(mMp4FileDataPtr->audioTrackPtr->MaxChunkSize, 15767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->currentChunk"); 15777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr-> 15787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->audioTrackPtr->currentChunk] 15797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 15807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 15827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 15847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update leftSpaceInChunk, currentPos and currentChunkDur*/ 15867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *leftSpaceInChunk = mMp4FileDataPtr->audioTrackPtr->MaxChunkSize; 15877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos = 0; 15887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 15907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* check wether to use a new stsc or not */ 15917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 15927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->currentStsc > 0) 15937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 15947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( mMp4FileDataPtr->audioTrackPtr-> 15957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr-> 15967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentStsc] & 0xFFF) != (mMp4FileDataPtr->audioTrackPtr-> 15977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr->currentStsc 15987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1] & 0xFFF)) 15997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentStsc += 1; 16007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 16027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentStsc += 1; 16037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* max nb of chunk is now dynamic */ 16057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->currentStsc 16067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 3 > M4MP4W_CHUNK_AUDIO_ALLOC_NB) 16077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_newAudioChunk : audio stsc table is full"); 16097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 16107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 16117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* set nb of samples in the new chunk to 0 */ 16137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 16147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr->currentStsc] = 16157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0 + (mMp4FileDataPtr->audioTrackPtr->currentChunk << 12); 16167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 16187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*set nb of samples in the new chunk to 0*/ 16197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 16217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 0; 16227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 16247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*set time of the new chunk to lastCTS (for initialization, but updated further to the 16267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CTS of the last sample in the chunk)*/ 16277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 16297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 16307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS 16317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * scale_audio); 16327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 16347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 16357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 16377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_newVideoChunk( M4OSA_Context context, 16387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *leftSpaceInChunk ) 16397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 16407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 16417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 16427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 16447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_video; 16457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_OPTIMIZE_FOR_PHONE 16477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 reallocNb; 16497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 16517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* audio only */ 16537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr == M4OSA_NULL) 16557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR; 16567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_newVideoChunk - flush video"); 16587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_2("current chunk = %d offset = 0x%x", 16597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk, 16607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos); 16617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_video = 1000.0 / mMp4FileDataPtr->videoTrackPtr->CommonData.timescale; 16637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 16657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 16677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* samples are already written to file */ 16687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 16697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*flush chunk*/ 16707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->Chunk[0], 16727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos, 16737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 16747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 16757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 16777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 16787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition temp = mMp4FileDataPtr->absoluteCurrentPos; 16797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1( 16807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_newVideoChunk: putBlock error when flushing chunk: %#X", 16817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 16827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Ouch, we got an error writing to the file, but we need to properly react so that the 16837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi state is still consistent and we can properly close the file so that what has been 16847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi recorded so far is not lost. Yay error recovery! */ 16857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* First, we do not know where we are in the file. Put us back at where we were before 16877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi attempting to write the data. That way, we're consistent with the chunk state data. */ 16887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->seek( 16897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext, 16907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &temp); 16917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3( 16937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Backtracking to position 0x%08X, seek returned %d and position %08X", 16947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos, err, temp); 16957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Then, do not update any info whatsoever in the writing state. This will have the 16967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi consequence that it will be as if the chunk has not been flushed yet, and therefore it 16977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi will be done as part of closeWrite (where there could be room to do so, if some 16987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi emergency room is freed for that purpose). */ 16997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* And lastly (for here), return that we've reached the limit of available space. 17017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi We don't care about the error originally returned by putBlock. */ 17027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 17047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 17077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update chunk offset*/ 17097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 17117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkOffsetTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 17127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos; 17137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*add chunk size to absoluteCurrentPos*/ 17157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos += 17167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos; 17177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 17197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update chunk info before to go for a new one*/ 17217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 17237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSizeTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 17247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos; 17257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 17267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 17277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS 17287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * scale_video); 17297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk += 1; 17317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 16; 17327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*alloc new chunk*/ 17347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*only if not already allocated*/ 17357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->currentChunk 17367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk) 17377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update LastAllocatedChunk ( -> = currentChunk)*/ 17397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk += 1; 17407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*max nb of chunk is now dynamic*/ 17427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 17437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ( mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk 17457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 3 > M4MP4W_CHUNK_ALLOC_NB) 17467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_newVideoChunk : video chunk table is full"); 17487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 17497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 17507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 17527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (((mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk) 17547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi % M4MP4W_CHUNK_ALLOC_NB) == 0) 17557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 17567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb = mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk 17577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + M4MP4W_CHUNK_ALLOC_NB; 17587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 17607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->Chunk = 17627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UChar ** )M4MP4W_realloc( 17637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr->Chunk, 17647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( reallocNb 17657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - M4MP4W_CHUNK_ALLOC_NB) * sizeof(M4OSA_UChar *), 17667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UChar *)); 17677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->Chunk != M4OSA_NULL, 17687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 17697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 17717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable = 17737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 17747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr-> 17757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkOffsetTable, ( reallocNb - M4MP4W_CHUNK_ALLOC_NB) 17767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 17777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UInt32)); 17787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable 17797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 17807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 17827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable = 17847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 17857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr-> 17867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSizeTable, ( reallocNb - M4MP4W_CHUNK_ALLOC_NB) 17877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 17887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UInt32)); 17897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkSizeTable 17907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 17917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 17927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable = 17937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 17947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr-> 17957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable, ( reallocNb - M4MP4W_CHUNK_ALLOC_NB) 17967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * sizeof(M4OSA_UInt32), 17977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4OSA_UInt32)); 17987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable 17997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 18007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable = 18027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4MP4W_Time32 *)M4MP4W_realloc( 18037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr-> 18047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable, ( reallocNb 18057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - M4MP4W_CHUNK_ALLOC_NB) * sizeof(M4MP4W_Time32), 18067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi reallocNb * sizeof(M4MP4W_Time32)); 18077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable 18087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 18097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 18117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 18137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 18157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->videoTrackPtr->currentChunk] = (M4OSA_UChar 1816694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(mMp4FileDataPtr->videoTrackPtr->MaxChunkSize, 18177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->MaxChunkSize"); 18187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr-> 18197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->videoTrackPtr->currentChunk] 18207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 18217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 18237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update leftSpaceInChunk, currentPos and currentChunkDur*/ 18277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *leftSpaceInChunk = mMp4FileDataPtr->videoTrackPtr->MaxChunkSize; 18287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos = 0; 18297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 18317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* check wether to use a new stsc or not */ 18327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->currentStsc > 0) 18347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->videoTrackPtr-> 18367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr-> 18377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentStsc] & 0xFFF) != (mMp4FileDataPtr->videoTrackPtr-> 18387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr->currentStsc 18397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1] & 0xFFF)) 18407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentStsc += 1; 18417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 18437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentStsc += 1; 18447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* max nb of chunk is now dynamic */ 18467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->currentStsc 18477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 3 > M4MP4W_CHUNK_ALLOC_NB) 18487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 18497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_newVideoChunk : video stsc table is full"); 18507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 18517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 18527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* set nb of samples in the new chunk to 0 */ 18547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 18557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr->currentStsc] = 18567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0 + (mMp4FileDataPtr->videoTrackPtr->currentChunk << 12); 18577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 18597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*set nb of samples in the new chunk to 0*/ 18607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 18627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 0; 18637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 18657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*set time of the new chunk to lastCTS (for initialization, but updated further to the 18677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CTS of the last sample in the chunk)*/ 18687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 18707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 18717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS 18727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * scale_video); 18737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 18757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 18767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 18787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_startAU( M4OSA_Context context, M4SYS_StreamID streamID, 18797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_AccessUnit *auPtr ) 18807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 18817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 18827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 18837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 18857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 leftSpaceInChunk; 18877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 chunkDurMs; 18887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_audio; 18907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_video; 18917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 18937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(auPtr != M4OSA_NULL, M4ERR_PARAMETER); 18947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("----- M4MP4W_startAU -----"); 18967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 18977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check macro state*/ 18987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->state == M4MP4W_writing), M4ERR_STATE); 18997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamID == AudioStreamID) /*audio stream*/ 19017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("M4MP4W_startAU -> audio"); 19037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_audio = 19057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1000.0 / mMp4FileDataPtr->audioTrackPtr->CommonData.timescale; 19067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*audio microstate*/ 19087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->audioTrackPtr->microState 19097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4MP4W_writing), M4ERR_STATE); 19107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->microState = M4MP4W_writing_startAU; 19117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi leftSpaceInChunk = mMp4FileDataPtr->audioTrackPtr->MaxChunkSize 19137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - mMp4FileDataPtr->audioTrackPtr->currentPos; 19147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_2("audio %d %d", 19167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos, leftSpaceInChunk); 19177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkDurMs = 19197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(( mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS 19207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * scale_audio) - mMp4FileDataPtr->audioTrackPtr-> 19217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->audioTrackPtr-> 19227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentChunk]); 19237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((leftSpaceInChunk < mMp4FileDataPtr->audioTrackPtr->MaxAUSize) 19257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (( mMp4FileDataPtr->InterleaveDur != 0) 19267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (chunkDurMs >= mMp4FileDataPtr->InterleaveDur))) 19277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 19297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* only if there is at least 1 video sample in the chunk */ 19307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->videoTrackPtr != M4OSA_NULL) 19327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->videoTrackPtr->currentPos > 0)) 19337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* close the opened video chunk before creating a new audio one */ 19357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_newVideoChunk(context, &leftSpaceInChunk); 19367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (err != M4NO_ERROR) 19387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 19397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 19427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* not enough space in current chunk: create a new one */ 19437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_newAudioChunk(context, &leftSpaceInChunk); 19457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (err != M4NO_ERROR) 19477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 19487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->size = leftSpaceInChunk; 19517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 19537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = (M4OSA_MemAddr32)(mMp4FileDataPtr->audioTrackPtr-> 19557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->audioTrackPtr->currentChunk] 19567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->audioTrackPtr->currentPos); 19577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 19597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 19617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->audioTrackPtr->Chunk[0] 19627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->audioTrackPtr->currentPos); 19637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 19657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 19677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (streamID == VideoStreamID) /*video stream*/ 19687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 19697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("M4MP4W_startAU -> video"); 19707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_video = 19727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1000.0 / mMp4FileDataPtr->videoTrackPtr->CommonData.timescale; 19737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*video microstate*/ 19757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->videoTrackPtr->microState 19767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4MP4W_writing), M4ERR_STATE); 19777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->microState = M4MP4W_writing_startAU; 19787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi leftSpaceInChunk = mMp4FileDataPtr->videoTrackPtr->MaxChunkSize 19807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - mMp4FileDataPtr->videoTrackPtr->currentPos; 19817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkDurMs = 19837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(( mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS 19847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * scale_video) - mMp4FileDataPtr->videoTrackPtr-> 19857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->videoTrackPtr-> 19867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentChunk]); 19877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 19897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi leftSpaceInChunk = mMp4FileDataPtr->videoTrackPtr->MaxChunkSize; 19917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 19937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_2("video %d %d", 19957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos, leftSpaceInChunk); 19967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 19977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( leftSpaceInChunk < mMp4FileDataPtr->videoTrackPtr->MaxAUSize) 19987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (( mMp4FileDataPtr->InterleaveDur != 0) 19997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (chunkDurMs >= mMp4FileDataPtr->InterleaveDur)) 20007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 20017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (( mMp4FileDataPtr->videoTrackPtr->MaxAUperChunk != 0) 20037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (( mMp4FileDataPtr->videoTrackPtr-> 20047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr-> 20057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentStsc] & 0xFFF) 20067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == mMp4FileDataPtr->videoTrackPtr->MaxAUperChunk)) 20077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 20097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ) 20117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*not enough space in current chunk: create a new one*/ 20137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_newVideoChunk(context, &leftSpaceInChunk); 20147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (err != M4NO_ERROR) 20167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 20177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3("startAU: size 0x%x pos 0x%x chunk %u", auPtr->size, 20207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos, 20217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk); 20227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_1("adr = 0x%p", auPtr->dataAddress); 20247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (auPtr->dataAddress) 20267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 20277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE3_3(" data = %08X %08X %08X", auPtr->dataAddress[0], 20287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress[1], auPtr->dataAddress[2]); 20297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->size = leftSpaceInChunk; 20327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 20337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 20357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH264) 20367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 20377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->videoTrackPtr-> 20387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->videoTrackPtr->currentChunk] 20397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos + 4); 20407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 20417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 20427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->videoTrackPtr-> 20437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Chunk[mMp4FileDataPtr->videoTrackPtr->currentChunk] 20447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos); 20457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 20477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 20487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 20507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH264) 20517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 20527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->videoTrackPtr->Chunk[0] + 4); 20537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 20547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 20557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->videoTrackPtr->Chunk[0]); 20567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 20587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 20607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH264) 20617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 20627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->videoTrackPtr->Chunk[0] 20637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos 20647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 4); /* In H264, we must start by the length of the NALU, coded in 4 bytes */ 20657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 20667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress = 20677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)(mMp4FileDataPtr->videoTrackPtr->Chunk[0] 20687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos); 20697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_UNBUFFERED_VIDEO*/ 20717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 20737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 20757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 20767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 20777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_3("M4MPW_startAU: start address:%p, size:%lu, stream:%d", 20797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress, auPtr->size, streamID); 20807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 20827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 20837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 20857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_processAU( M4OSA_Context context, M4SYS_StreamID streamID, 20867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_AccessUnit *auPtr ) 20877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 20887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 20897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 20907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 delta; 20917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 lastSampleDur; 20927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 i; 20937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*expectedSize is the max filesize to forecast when adding a new AU:*/ 20947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 expectedSize = 20957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32; /*initialized with an estimation of the max metadata space needed for an AU.*/ 20967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_audio = 0.0; 20977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_video = 0.0; 20987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 20997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 21007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 21017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check macro state*/ 21037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->state == M4MP4W_writing), M4ERR_STATE); 21047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("M4MP4W_processAU"); 21067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamID == AudioStreamID) 21087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_audio = 21097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1000.0 / mMp4FileDataPtr->audioTrackPtr->CommonData.timescale; 21107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamID == VideoStreamID) 21127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_video = 21137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1000.0 / mMp4FileDataPtr->videoTrackPtr->CommonData.timescale; 21147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* PL 27/10/2008: after the resurgence of the AAC 128 bug, I added a debug check that 21167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi the encoded data didn't overflow the available space in the AU */ 21177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamID ) 21197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case AudioStreamID: 21217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(auPtr->size 21227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->audioTrackPtr->currentPos 21237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > mMp4FileDataPtr->audioTrackPtr->MaxChunkSize, 21247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CONTEXT_FAILED, 21257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Uh oh. Buffer overflow in the writer. Abandon ship!"); 21267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2(auPtr->size 21277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > mMp4FileDataPtr->audioTrackPtr->MaxAUSize, 21287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CONTEXT_FAILED, 21297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Oops. An AU went over the declared Max AU size.\ 21307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi You might wish to investigate that."); 21317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case VideoStreamID: 21347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF1(auPtr->size 21357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos 21367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > mMp4FileDataPtr->videoTrackPtr->MaxChunkSize, 21377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CONTEXT_FAILED, 21387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Uh oh. Buffer overflow in the writer. Abandon ship!"); 21397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DEBUG_IF2(auPtr->size 21407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi > mMp4FileDataPtr->videoTrackPtr->MaxAUSize, 21417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CONTEXT_FAILED, 21427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Oops. An AU went over the declared Max AU size.\ 21437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi You might wish to investigate that."); 21447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 21457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*only if not in the case audio with estimateAudioSize 21487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (else, size already estimated at this point)*/ 21497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->estimateAudioSize == M4OSA_FALSE) 21507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (streamID == VideoStreamID)) 21517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check filesize if needed*/ 21537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->MaxFileSize != 0) 21547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi expectedSize += mMp4FileDataPtr->filesize + auPtr->size; 21567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((streamID == VideoStreamID) 21587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 21597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH264)) 21607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi expectedSize += 4; 21627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (expectedSize > mMp4FileDataPtr->MaxFileSize) 21657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("processAU : !! FILESIZE EXCEEDED !!"); 21677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* patch for autostop is MaxFileSize exceeded */ 21697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_processAU : stop at targeted filesize"); 21707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 21717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*case audioMsStopTime has already been set during video processing, 21767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi and now check it for audio*/ 21777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->estimateAudioSize == M4OSA_TRUE) 21787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (streamID == AudioStreamID)) 21797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioMsStopTime <= (auPtr->CTS *scale_audio)) 21817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* bugfix: if a new chunk was just created, cancel it before to close */ 21837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->audioTrackPtr->currentChunk != 0) 21847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->audioTrackPtr->currentPos == 0)) 21857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentChunk--; 21877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_processAU : audio stop time reached"); 21897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 21907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 21927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (streamID == AudioStreamID) /*audio stream*/ 21947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 21957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("M4MP4W_processAU -> audio"); 21967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 21977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*audio microstate*/ 21987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->audioTrackPtr->microState 21997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4MP4W_writing_startAU), M4ERR_STATE); 22007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->microState = M4MP4W_writing; 22017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos += auPtr->size; 22037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Warning: time conversion cast 64to32! */ 22047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi delta = (M4MP4W_Time32)auPtr->CTS 22057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS; 22067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* DEBUG stts entries which are equal to 0 */ 22087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1("A_DELTA = %ld\n", delta); 22097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb 22117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == 0) /*test if first AU*/ 22127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*set au size*/ 22147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize = auPtr->size; 22157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*sample duration is a priori constant in audio case, */ 22177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*but if an Au at least has different size, a stsz table will be created */ 22187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*mMp4FileDataPtr->audioTrackPtr->sampleDuration = delta; */ 22207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*TODO test sample duration? (should be 20ms in AMR8, 160 tics with timescale 8000) */ 22217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 22237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*check if au size is constant (audio) */ 22257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*0 sample size means non constant size*/ 22267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize != 0) 22277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize 22297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != auPtr->size) 22307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*first AU with different size => non constant size => STSZ table needed*/ 22327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*computation of the nb of block of size M4MP4W_STSZ_ALLOC_SIZE to allocate*/ 22337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedStszBlocks = 22347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1 + mMp4FileDataPtr->audioTrackPtr-> 22357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sampleNb 22367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 4 / M4MP4W_STSZ_AUDIO_ALLOC_SIZE; 22377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ = 2238694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UInt32 *)M4OSA_32bitAlignedMalloc( 22397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 22407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedStszBlocks 22417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STSZ_AUDIO_ALLOC_SIZE, 22427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"audioTrackPtr->TABLE_STSZ"); 22437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ 22447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 22457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; 22477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i < mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 22487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++ ) 22497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ[i] = 22517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 22527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sampleSize; 22537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 22557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSZ[mMp4FileDataPtr->audioTrackPtr-> 22567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sampleNb] = auPtr->size; 22577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize = 22587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /*used as a flag in that case*/ 22597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*more bytes in the file in that case:*/ 22607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->estimateAudioSize == M4OSA_FALSE) 22617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 22627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4 * mMp4FileDataPtr->audioTrackPtr-> 22637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sampleNb; 22647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*else table already exists*/ 22677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 22687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 22707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (4 *(mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb + 3) 22727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedStszBlocks 22737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STSZ_AUDIO_ALLOC_SIZE) 22747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 22767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_processAU : audio stsz table is full"); 22777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 22787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 22797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 22817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 22827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (4 *mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb 22837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedStszBlocks 22847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STSZ_AUDIO_ALLOC_SIZE) 22857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 22867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedStszBlocks += 22877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 22887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ = 22897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 22907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr-> 22917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSZ, ( mMp4FileDataPtr->audioTrackPtr-> 22927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedStszBlocks - 1) 22937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STSZ_AUDIO_ALLOC_SIZE, 22947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 22957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedStszBlocks 22967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STSZ_AUDIO_ALLOC_SIZE); 22977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ 22987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 22997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 23027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 23047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSZ[mMp4FileDataPtr->audioTrackPtr-> 23057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sampleNb] = auPtr->size; 23067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->estimateAudioSize == M4OSA_FALSE) 23087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 4; 23097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (delta > mMp4FileDataPtr->audioTrackPtr->sampleDuration) 23137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* keep track of real sample duration*/ 23157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->sampleDuration = delta; 23167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb 23197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == 0) /*test if first AU*/ 23207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[0] = 1; 23227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[1] = 0; 23237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb = 1; 23247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 8; 23257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb 23277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == 1) /*test if second AU*/ 23287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef DUPLICATE_STTS_IN_LAST_AU 23307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[0] += 1; 23327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*DUPLICATE_STTS_IN_LAST_AU*/ 23347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[1] = delta; 23367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb += 1; 23377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 8; 23387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 23407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*retrieve last sample delta*/ 23427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lastSampleDur = mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[2 23437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (mMp4FileDataPtr->audioTrackPtr-> 23447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1) - 1]; 23457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 23477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (8 *(mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb 23497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 3) >= mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedSttsBlocks 23507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STTS_AUDIO_ALLOC_SIZE) 23517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_processAU : audio stts table is full"); 23537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 23547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 23577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (8 *mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb 23597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedSttsBlocks 23607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STTS_AUDIO_ALLOC_SIZE) 23617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->nbOfAllocatedSttsBlocks += 1; 23637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS = 23647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 23657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->audioTrackPtr-> 23667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS, ( mMp4FileDataPtr->audioTrackPtr-> 23677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedSttsBlocks 23687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1) * M4MP4W_STTS_AUDIO_ALLOC_SIZE, 23697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 23707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedSttsBlocks 23717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STTS_AUDIO_ALLOC_SIZE); 23727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioTrackPtr->TABLE_STTS 23737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 23747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 23777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (delta != lastSampleDur) /*new entry in the table*/ 23797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[2 *( 23817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 23827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1)] = 1; 23837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[2 *( 23847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 23857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1) + 1] = delta; 23867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb += 23877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 23887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 8; 23897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 23917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 23927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*increase of 1 the number of consecutive AUs with same duration*/ 23937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[2 *( 23947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 23957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1) - 2] += 1; 23967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 23987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb += 1; 23997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 24007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 24027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr->currentStsc] += 24037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 24047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 24067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 24087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] += 24097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 24107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 24127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Warning: time conversion cast 64to32! */ 24137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS = 24157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4MP4W_Time32)auPtr->CTS; 24167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (streamID == VideoStreamID) /*video stream*/ 24187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_0("M4MP4W_processAU -> video"); 24207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* In h264, the size of the AU must be added to the data */ 24227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 24237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH264) 24247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Add the size of the NALU in BE */ 24267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_MemAddr8 pTmpDataAddress = M4OSA_NULL; 24277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->dataAddress -= 1; 24287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pTmpDataAddress = (M4OSA_MemAddr8)auPtr->dataAddress; 24297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // bit manipulation 24317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pTmpDataAddress++ = (M4OSA_UInt8)((auPtr->size >> 24) & 0x000000FF); 24327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pTmpDataAddress++ = (M4OSA_UInt8)((auPtr->size >> 16) & 0x000000FF); 24337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pTmpDataAddress++ = (M4OSA_UInt8)((auPtr->size >> 8) & 0x000000FF); 24347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pTmpDataAddress++ = (M4OSA_UInt8)((auPtr->size) & 0x000000FF); 24357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->size += 4; 24377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*video microstate*/ 24407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->videoTrackPtr->microState 24417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4MP4W_writing_startAU), M4ERR_STATE); 24427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->microState = M4MP4W_writing; 24437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 24457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* samples are written to file now */ 24467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock((M4OSA_UChar *)auPtr->dataAddress, auPtr->size, 24487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 24497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 24507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (err != M4NO_ERROR) 24527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 24537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition temp = mMp4FileDataPtr->absoluteCurrentPos 24547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos; 24557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1( 24567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_processAU: putBlock error when writing unbuffered video sample: %#X", 24577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err); 24587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Ouch, we got an error writing to the file, but we need to properly react so that 24597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi the state is still consistent and we can properly close the file so that what has 24607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi been recorded so far is not lost. Yay error recovery! */ 24617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* First, we do not know where we are in the file. Put us back at where we were before 24637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi attempting to write the data. That way, we're consistent with the chunk and sample 24647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi state data.absoluteCurrentPos is only updated for chunks, it points to the beginning 24657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi of the chunk,therefore we need to add videoTrackPtr->currentPos to know where we 24667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi were in the file. */ 24677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->seek( 24687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext, 24697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &temp); 24707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_3( 24727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "Backtracking to position 0x%08X, seek returned %d and position %08X", 24737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos 24747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + mMp4FileDataPtr->videoTrackPtr->currentPos, err, temp); 24757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Then, do not update any info whatsoever in the writing state. This will have the 24777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi consequence that it will be as if the sample has never been written, so the chunk 24787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi will be merely closed after the previous sample (the sample we attempted to write 24797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi here is lost). */ 24807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* And lastly (for here), return that we've reached the limit of available space. 24827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi We don't care about the error originally returned by putBlock. */ 24837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 24857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 24867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 24887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos += auPtr->size; 24907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Warning: time conversion cast 64to32! */ 24927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi delta = (M4MP4W_Time32)auPtr->CTS 24937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS; 24947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* DEBUG stts entries which are equal to 0 */ 24967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE2_1("V_DELTA = %ld\n", delta); 24977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 24987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 24997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (2 *(mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb + 3) 25017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStszBlocks 25027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STSZ_ALLOC_SIZE) 25037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_processAU : video stsz table is full"); 25057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 25067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 25097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSZ[mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb] = 25107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16)auPtr->size; 25117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 4; 25127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 25147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (4 *mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb 25167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStszBlocks 25177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STSZ_ALLOC_SIZE) 25187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStszBlocks += 1; 25207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ = 25227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 25237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ, 25247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( mMp4FileDataPtr->videoTrackPtr-> 25257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedStszBlocks 25267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1) * M4MP4W_STSZ_ALLOC_SIZE, 25277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStszBlocks 25287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STSZ_ALLOC_SIZE); 25297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ != M4OSA_NULL, 25317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 25327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 25357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSZ[mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb] = 25367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->size; 25377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 4; 25387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 25407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb 25427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == 0) /*test if first AU*/ 25437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 25457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Lo(&mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[0], 1); 25477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Hi(&mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[0], 0); 25487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 25507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[0] = 1; 25527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[1] = 0; 25537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 25557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb = 1; 25577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 8; 25587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb 25607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == 1 ) /*test if second AU*/ 25617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 25637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Hi(&mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[0], 25657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt16)delta); 25667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 25687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[1] = delta; 25707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 25727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 25757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*retrieve last sample delta*/ 25777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 25787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lastSampleDur = M4MP4W_get32_Hi(&mMp4FileDataPtr->videoTrackPtr-> 25807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 25817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1]); 25827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (4 *(mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb 25847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 3) >= mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedSttsBlocks 25857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STTS_ALLOC_SIZE) 25867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 25877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_processAU : video stts table is full"); 25887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 25897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 25907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 25927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi lastSampleDur = mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 25947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (mMp4FileDataPtr->videoTrackPtr-> 25957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1) + 1]; 25967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 25977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (8 *mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb 25987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedSttsBlocks 25997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STTS_ALLOC_SIZE) 26007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedSttsBlocks += 1; 26027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS = 26037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 26047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr-> 26057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS, ( mMp4FileDataPtr->videoTrackPtr-> 26067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedSttsBlocks 26077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1) * M4MP4W_STTS_ALLOC_SIZE, 26087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 26097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedSttsBlocks 26107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STTS_ALLOC_SIZE); 26117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->TABLE_STTS 26127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 26137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 26167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (delta != lastSampleDur) /*new entry in the table*/ 26187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 26207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Lo(&mMp4FileDataPtr->videoTrackPtr-> 26227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 26237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb], 1); 26247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Hi(&mMp4FileDataPtr->videoTrackPtr-> 26257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 26267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb], (M4OSA_UInt16)delta); 26277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 26297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 *( 26317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 26327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb)] = 1; 26337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 26347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(mMp4FileDataPtr->videoTrackPtr-> 26357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb)+1] = delta; 26367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 26387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb += 26407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 26417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 8; 26427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 26447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*increase of 1 the number of consecutive AUs with same duration*/ 26467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 26477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 26497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 26507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1] += 1; 26517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 26537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 *( 26557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 26567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1)] += 1; 26577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 26597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb += 1; 26647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 26657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 26677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr->currentStsc] += 26687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 26697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 26717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 26737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] += 26747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1; 26757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 26777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (auPtr->attribute == AU_RAP) 26797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 26817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (4 *(mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb + 3) 26837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStssBlocks 26847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STSS_ALLOC_SIZE) 26857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_processAU : video stss table is full"); 26877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4WAR_MP4W_OVERSIZE; 26887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 26897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 26917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 26927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (4 *mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb 26937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >= mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStssBlocks 26947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *M4MP4W_STSS_ALLOC_SIZE) 26957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 26967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->nbOfAllocatedStssBlocks += 1; 26977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STSS = 26987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32 *)M4MP4W_realloc( 26997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_MemAddr32)mMp4FileDataPtr->videoTrackPtr-> 27007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSS, ( mMp4FileDataPtr->videoTrackPtr-> 27017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedStssBlocks 27027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1) * M4MP4W_STSS_ALLOC_SIZE, 27037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 27047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nbOfAllocatedStssBlocks 27057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_STSS_ALLOC_SIZE); 27067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->TABLE_STSS 27077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 27087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_OPTIMIZE_FOR_PHONE*/ 27117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 27137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STSS[mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb] = 27147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb; 27157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb += 1; 27167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 4; 27177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Warning: time conversion cast 64to32! */ 27207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS = 27217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4MP4W_Time32)auPtr->CTS; 27227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 27247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 27257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* I moved some state modification to after we know the sample has been written correctly. */ 27277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->estimateAudioSize == M4OSA_TRUE) 27287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (streamID == VideoStreamID)) 27297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 27307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioMsStopTime = 27317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4MP4W_Time32)(auPtr->CTS * scale_video); 27327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->estimateAudioSize == M4OSA_FALSE) 27357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (streamID == VideoStreamID)) 27367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 27377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update fileSize*/ 27387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += auPtr->size; 27397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->estimateAudioSize == M4OSA_TRUE) 27427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (streamID == VideoStreamID)) 27437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 27447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update filesize with estimated audio data that will be added later. */ 27457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Warning: Assumption is made that: */ 27467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* - audio samples have constant size (e.g. no sid). */ 27477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* - max audio sample size has been set, and is the actual sample size. */ 27487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->audioMsChunkDur != 0, 27507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4WAR_MP4W_NOT_EVALUABLE); 27517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize -= 27527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)(( mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS 27537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * scale_video) * (0.05/*always 50 AMR samples per second*/ 27547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(M4OSA_Double)mMp4FileDataPtr->audioTrackPtr->MaxAUSize 27557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 16/*additional data for a new chunk*/ 27567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / (M4OSA_Double)mMp4FileDataPtr->audioMsChunkDur)); 27577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += (M4OSA_UInt32)(( auPtr->CTS * scale_video) 27597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (0.05/*always 50 AMR samples per second*/ 27607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(M4OSA_Double)mMp4FileDataPtr->audioTrackPtr->MaxAUSize 27617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 16/*additional data for a new chunk*/ 27627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / (M4OSA_Double)mMp4FileDataPtr->audioMsChunkDur)); 27637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 27647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_4("processAU : size 0x%x mode %d filesize %lu limit %lu", 27667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi auPtr->size, auPtr->attribute, mMp4FileDataPtr->filesize, 27677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxFileSize); 27687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 27707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 27717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 27737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_closeWrite( M4OSA_Context context ) 27747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 27757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 27767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 27777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err2 = M4NO_ERROR, err3 = M4NO_ERROR; 27787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Warning: test should be done here to ensure context->pContext is not M4OSA_NULL, 27807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi but C is not C++...*/ 27817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 27827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 27837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UChar camcoder_maj, camcoder_min, camcoder_rev; /*camcoder version*/ 27847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bAudio = 27857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (( mMp4FileDataPtr->hasAudio) 27867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb 27877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != 0)); /*((mMp4FileDataPtr->audioTrackPtr != M4OSA_NULL) && 27887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb != 0));*/ 27897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bVideo = 27907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (( mMp4FileDataPtr->hasVideo) 27917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb 27927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != 0)); /*((mMp4FileDataPtr->videoTrackPtr != M4OSA_NULL) && 27937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb != 0));*/ 27947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bH263 = M4OSA_FALSE; 27957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bH264 = M4OSA_FALSE; 27967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bMP4V = M4OSA_FALSE; 27977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bAAC = M4OSA_FALSE; 27987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bEVRC = M4OSA_FALSE; 27997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*intermediate variables*/ 28017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 A, B, N, AB4N; 28027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Trak variables*/ 28047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_trakId = AudioStreamID; /* (audio=1)*/ 28057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* first trak offset is 32+moovSize, second equals 32+moovSize+1st_track_size*/ 28067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_trakOffset = 32; 28077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_sttsSize = 24; /* A (audio=24)*/ 28087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_stszSize = 20; /* B (audio=20)*/ 28097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_trakSize = 402; /* (audio=402)*/ 28107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_mdiaSize = 302; /* (audio=302)*/ 28117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_minfSize = 229; /* (audio=229)*/ 28127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_stblSize = 169; /* (audio=169)*/ 28137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_stsdSize = 69; /* (audio=69 )*/ 28147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_esdSize = 53; /* (audio=53 )*/ 28157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_dataSize = 0; /* temp: At the end, = currentPos*/ 28167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 a_trakDuration = 0; /* equals lastCTS*/ 28177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 a_msTrakDuration = 0; 28187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_stscSize = 28; /* 16+12*nbchunksaudio*/ 28197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_stcoSize = 20; /* 16+4*nbchunksaudio*/ 28207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_trakId = VideoStreamID; /* (video=2)*/ 28227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* first trak offset is 32+moovSize, second equals 32+moovSize+1st_track_size*/ 28237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_trakOffset = 32; 28247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_sttsSize = 0; /* A (video=16+8J)*/ 28257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_stszSize = 0; /* B (video=20+4K)*/ 28267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_trakSize = 0; /* (h263=A+B+4N+426), (mp4v=A+B+dsi+4N+448) */ 28277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_mdiaSize = 0; /* (h263=A+B+4N+326), (mp4v=A+B+dsi+4N+348) */ 28287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_minfSize = 0; /* (h263=A+B+4N+253), (mp4v=A+B+dsi+4N+275) */ 28297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_stblSize = 0; /* (h263=A+B+4N+189), (mp4v=A+B+dsi+4N+211) */ 28307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_stsdSize = 0; /* (h263=117) , (mp4v=139+dsi )*/ 28317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_esdSize = 0; /* (h263=101) , (mp4v=153+dsi )*/ 28327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_dataSize = 0; /* temp: At the end, = currentPos*/ 28337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 v_trakDuration = 0; /* equals lastCTS*/ 28347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 v_msTrakDuration = 0; 28357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_stscSize = 28; /* 16+12*nbchunksvideo*/ 28367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_stcoSize = 20; /* 16+4*nbchunksvideo*/ 28377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*video variables*/ 28397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_stssSize = 0; /* 4*N+16 STSS*/ 28407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*aac & mp4v temp variable*/ 28427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 dsi = 0; 28437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*H264 variables*/ 28457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_avcCSize = 0; /* dsi+15*/ 28467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*MP4V variables*/ 28487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 v_esdsSize = 0; /* dsi+37*/ 28497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 v_ESDescriptorSize = 28507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /* dsi+23 (warning: check dsi<105 for coding size on 1 byte)*/ 28517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 v_DCDescriptorSize = 0; /* dsi+15*/ 28527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*AAC variables*/ 28547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 a_esdsSize = 0; /* dsi+37*/ 28557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 a_ESDescriptorSize = 28567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0; /* dsi+23 (warning: check dsi<105 for coding size on 1 byte)*/ 28577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 a_DCDescriptorSize = 0; /* dsi+15*/ 28587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*General variables*/ 28607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* audio chunk size + video chunk size*/ 28627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 mdatSize = 8; 28637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 moovSize = 116; /* 116 + 402(audio) + (A+B+4N+426)(h263) or */ 28647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* (A+B+dsi+4N+448)(mp4v) */ 28657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 creationTime; /* C */ 28667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*flag to set up the chunk interleave strategy*/ 28687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool bInterleaveAV = 28697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (bAudio && bVideo && (mMp4FileDataPtr->InterleaveDur != 0)); 28707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context fileWriterContext = mMp4FileDataPtr->fileWriterContext; 28727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 i; 28747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_audio = 0.0; 28767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Double scale_video = 0.0; 28777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Time32 delta; 28787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 28807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_FilePosition moovPos, mdatPos; 28827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 28847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 28867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*macro state */ 28887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->state = M4MP4W_closed; 28897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if no data !*/ 28917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((!bAudio) && (!bVideo)) 28927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 28937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4NO_ERROR; /*would be better to return a warning ?*/ 28947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 28957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 28967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 28977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE 28987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Remove safety file to make room for what needs to be written out here 28997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (chunk flushing and moov). */ 29007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_TRUE == mMp4FileDataPtr->cleanSafetyFile) 29027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context tempContext; 29047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->openWrite(&tempContext, 29057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->safetyFileUrl, 29067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileWrite | M4OSA_kFileCreate); 29077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 29097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 29107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->closeWrite(tempContext); 29117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 29137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 29147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->safetyFileUrl = M4OSA_NULL; 29157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->cleanSafetyFile = M4OSA_FALSE; 29167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */ 29197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bVideo) 29217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable) 29237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->chunkSizeTable) 29247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 29257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable) 29267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 29277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable) 29287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ) 29297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->TABLE_STTS) 29307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->TABLE_STSS)) 29317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->closeWrite( 29337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext); /**< close the stream anyway */ 29347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_freeContext(context); /**< Free the context content */ 29357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 29367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*video microstate*/ 29397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->microState = M4MP4W_closed; 29407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*current chunk is the last one and gives the total number of video chunks (-1)*/ 29427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i < mMp4FileDataPtr->videoTrackPtr->currentChunk; i++ ) 29437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_dataSize += mMp4FileDataPtr->videoTrackPtr->chunkSizeTable[i]; 29457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 29487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_UNBUFFERED_VIDEO 29497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*flush chunk*/ 29507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->currentPos > 0) 29527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->Chunk[0], 29547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos, 29557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 29567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 29577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 29597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 29607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 29637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("flush video | CLOSE"); 29657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_3("current chunk = %d offset = 0x%x size = 0x%08X", 29667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk, 29677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos, 29687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos); 29697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update chunk offset*/ 29717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 29727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkOffsetTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 29737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos; 29747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*add chunk size to absoluteCurrentPos*/ 29767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos += 29777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos; 29787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 29797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update last chunk size, and add this value to v_dataSize*/ 29817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 29837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSizeTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 29847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos; 29857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_dataSize += 29867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentPos; /*add last chunk size*/ 29877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakDuration = mMp4FileDataPtr->videoTrackPtr-> 29897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.lastCTS; /* equals lastCTS*/ 29907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* bugfix: if a new chunk was just created, cancel it before to close */ 29927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->videoTrackPtr->currentChunk != 0) 29937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->videoTrackPtr->currentPos == 0)) 29947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 29957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk--; 29967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 29977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 29987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 29997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->videoTrackPtr-> 30007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->videoTrackPtr-> 30017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentStsc] & 0xFFF) == 0) 30027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentStsc--; 30047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 30057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_UNBUFFERED_VIDEO*/ 30077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Last sample duration */ 30097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If we have the file duration we use it, else we duplicate the last AU */ 30107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->MaxFileDuration > 0) 30127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* use max file duration to calculate delta of last AU */ 30147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi delta = mMp4FileDataPtr->MaxFileDuration 30157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - mMp4FileDataPtr->videoTrackPtr->CommonData.lastCTS; 30167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakDuration = mMp4FileDataPtr->MaxFileDuration; 30177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb > 1) 30197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* if more than 1 frame, create a new stts entry (else already created) */ 30217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb++; 30227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 30237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 30257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Lo(&mMp4FileDataPtr->videoTrackPtr-> 30277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 30287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1], 1); 30297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_put32_Hi(&mMp4FileDataPtr->videoTrackPtr-> 30307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 30317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1], delta); 30327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 30347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 30367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb 30377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1)] = 1; 30387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 30397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb 30407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1) + 1] = delta; 30417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 30437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 30457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 30467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* duplicate the delta of the previous frame */ 30487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb > 1) 30497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* if more than 1 frame, duplicate the stts entry (else already exists) */ 30517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 30527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakDuration += 30547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_get32_Hi(&mMp4FileDataPtr->videoTrackPtr-> 30557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 30567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1]); 30577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 30587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi TABLE_STTS[mMp4FileDataPtr->videoTrackPtr-> 30597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1] += 1; 30607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 30627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakDuration += mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 30647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (mMp4FileDataPtr->videoTrackPtr-> 30657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1) + 1]; 30667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[2 *( 30677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 30687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1)] += 1; 30697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 30717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 30727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 30737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 30747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("M4MP4W_closeWrite : ! videoTrackPtr,\ 30767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi cannot know the duration of the unique AU !"); 30777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* If there is an audio track, we use it as a file duration 30787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (and so, as AU duration...) */ 30797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr != M4OSA_NULL) 30807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 30827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_closeWrite : ! Let's use the audio track duration !"); 30837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[1] = 30847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)( 30857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS 30867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (1000.0 / mMp4FileDataPtr->audioTrackPtr-> 30877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.timescale)); 30887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakDuration = 30897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[1]; 30907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 30917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Else, we use a MAGICAL value (66 ms) */ 30927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 30937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 30947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 30957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_closeWrite : ! No audio track -> use magical value (66) !"); /* */ 30967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[1] = 66; 30977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakDuration = 66; 30987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 30997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Calculate table sizes */ 31037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi A = v_sttsSize = 16 + 8 * mMp4FileDataPtr->videoTrackPtr-> 31047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb; /* A (video=16+8J)*/ 31057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi B = v_stszSize = 20 + 4 * mMp4FileDataPtr->videoTrackPtr-> 31067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sampleNb; /* B (video=20+4K)*/ 31077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi N = mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb; 31087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi AB4N = A + B + 4 * N; 31097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_video = 31117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1000.0 / mMp4FileDataPtr->videoTrackPtr->CommonData.timescale; 31127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_msTrakDuration = (M4OSA_UInt32)(v_trakDuration * scale_video); 31137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Convert integers in the table from LE into BE*/ 31157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_OPTIMIZE_FOR_PHONE 31167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_table32ToBE(mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ, 31187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb); 31197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_table32ToBE(mMp4FileDataPtr->videoTrackPtr->TABLE_STTS, 31207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2 * (mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb)); 31217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 31237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_table32ToBE(mMp4FileDataPtr->videoTrackPtr->TABLE_STSS, 31257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb); 31267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 31287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH263) 31297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 31307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bH263 = M4OSA_TRUE; 31317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize = AB4N + 426; /* (h263=A+B+4N+426)*/ 31327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize = AB4N + 326; /* (h263=A+B+4N+326)*/ 31337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize = AB4N + 253; /* (h263=A+B+4N+253)*/ 31347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize = AB4N + 189; /* (h263=A+B+4N+189)*/ 31357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stsdSize = 117; /* (h263=117)*/ 31367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_esdSize = 101; /* (h263=101)*/ 31377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += AB4N + 426; 31397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (((M4OSA_Int32)mMp4FileDataPtr->videoTrackPtr->avgBitrate) != -1) 31417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 31427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*the optional 'bitr' atom is appended to the dsi,so filesize is 16 bytes bigger*/ 31437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize += 16; 31447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize += 16; 31457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize += 16; 31467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize += 16; 31477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stsdSize += 16; 31487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_esdSize += 16; 31497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 16; 31507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 31537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kH264) 31547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 31557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bH264 = M4OSA_TRUE; 31567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* For H264 there is no default DSI, and its presence is mandatory, 31577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi so check the DSI has been set*/ 31587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (0 == mMp4FileDataPtr->videoTrackPtr->dsiSize 31597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->DSI) 31607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 31617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 31627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_closeWrite: error, no H264 DSI has been set!"); 31637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4ERR_STATE; 31647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 31657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*H264 sizes of the atom*/ 31687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Remove the hardcoded DSI values of H264Block2 31707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // TODO: check bMULPPSSPS case 31717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_avcCSize = sizeof(M4OSA_UInt32) + sizeof(H264Block2) + 31727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize; 31737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize = AB4N + v_avcCSize + 411; 31757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize = AB4N + v_avcCSize + 311; 31767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize = AB4N + v_avcCSize + 238; 31777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize = AB4N + v_avcCSize + 174; 31787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stsdSize = v_avcCSize + 102; 31797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_esdSize = v_avcCSize + 86; 31807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += AB4N + v_avcCSize + 411; 31827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (mMp4FileDataPtr->videoTrackPtr->CommonData.trackType 31857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kMPEG_4) 31867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 31877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bMP4V = M4OSA_TRUE; 31887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* For MPEG4 there is no default DSI, and its presence is mandatory, 31897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi so check the DSI has been set*/ 31907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (0 == mMp4FileDataPtr->videoTrackPtr->dsiSize 31917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->DSI) 31927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 31937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 31947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_closeWrite: error, no MPEG4 DSI has been set!"); 31957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4ERR_STATE; 31967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 31977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 31987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 31997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*MP4V variables*/ 32007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi dsi = mMp4FileDataPtr->videoTrackPtr->dsiSize; 32017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_esdsSize = 37 + dsi; /* dsi+37*/ 32027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_ESDescriptorSize = 32037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23 32047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + dsi; /* dsi+23 (warning: check dsi<105 for coding size on 1 byte)*/ 32057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_DCDescriptorSize = 15 + dsi; /* dsi+15*/ 32067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize = AB4N + dsi + 448; /* (mp4v=A+B+dsi+4N+448) */ 32087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize = AB4N + dsi + 348; /* (mp4v=A+B+dsi+4N+348) */ 32097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize = AB4N + dsi + 275; /* (mp4v=A+B+dsi+4N+275) */ 32107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize = AB4N + dsi + 211; /* (mp4v=A+B+dsi+4N+211) */ 32117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stsdSize = dsi + 139; /* (mp4v=139+dsi)*/ 32127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_esdSize = dsi + 123; /* (mp4v=123+dsi)*/ 32137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += AB4N + dsi + 448; 32157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 32167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*video variables*/ 32187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stssSize = 16 + 4 * N; /* 4*N+16 STSS*/ 32197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 32217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* stsc update */ 32227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stscSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentStsc; 32247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentStsc; 32257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentStsc; 32267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentStsc; 32277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentStsc; 32287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentStsc; 32297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* stco update */ 32317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stcoSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 32397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*stsc/stco update*/ 32407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stscSize += 12 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stcoSize += 4 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_stblSize += 16 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_minfSize += 16 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_mdiaSize += 16 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakSize += 16 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 16 * mMp4FileDataPtr->videoTrackPtr->currentChunk; 32487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 32507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update last chunk time*/ 32527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr-> 32547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->videoTrackPtr->currentChunk] = 32557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_msTrakDuration; 32567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 32577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bAudio) 32597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 32607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((M4OSA_NULL == mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable) 32617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == mMp4FileDataPtr->audioTrackPtr->chunkSizeTable) 32627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 32637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable) 32647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 32657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable) 32667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == mMp4FileDataPtr->audioTrackPtr->TABLE_STTS)) 32677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 32687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->closeWrite( 32697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext); /**< close the stream anyway */ 32707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_freeContext(context); /**< Free the context content */ 32717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 32727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 32737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*audio microstate*/ 32757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->microState = M4MP4W_closed; 32767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.trackType == M4SYS_kAAC) 32787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 32797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bAAC = 32807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRUE; /*else, audio is implicitely amr in the following*/ 32817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi dsi = mMp4FileDataPtr->audioTrackPtr->dsiSize; /*variable size*/ 32827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_esdsSize = 37 + dsi; /* dsi+37*/ 32847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_ESDescriptorSize = 32857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 23 32867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + dsi; /* dsi+23 (warning: check dsi<105 for coding size on 1 byte)*/ 32877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_DCDescriptorSize = 15 + dsi; /* dsi+15*/ 32887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_esdSize = dsi + 73; /*overwrite a_esdSize with aac value*/ 32907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*add dif. between amr & aac sizes: (- 53 + dsi + 37)*/ 32917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stsdSize += dsi + 20; 32927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize += dsi + 20; 32937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize += dsi + 20; 32947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize += dsi + 20; 32957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize += dsi + 20; 32967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += dsi + 20; 32977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 32987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 32997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.trackType 33007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kEVRC) 33017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bEVRC = 33037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRUE; /*else, audio is implicitely amr in the following*/ 33047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* evrc dsi is only 6 bytes while amr dsi is 9 bytes,all other blocks are unchanged */ 33067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_esdSize -= 3; 33077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stsdSize -= 3; 33087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize -= 3; 33097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize -= 3; 33107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize -= 3; 33117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize -= 3; 33127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize -= 3; 33137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 33147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize == 0) 33167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ) 33187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->closeWrite( 33207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext); /**< close the stream anyway */ 33217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_freeContext(context); /**< Free the context content */ 33227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_ALLOC; 33237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 33247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*Convert integers in the table from LE into BE*/ 33257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_table32ToBE(mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ, 33267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb); 33277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stszSize += 33287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4 * mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 33297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize += 33307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4 * mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 33317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize += 33327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4 * mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 33337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize += 33347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4 * mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 33357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize += 33367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4 * mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 33377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 4 * mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb; 33387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 33397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 402; 33417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*current chunk is the last one and gives the total number of audio chunks (-1)*/ 33437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i < mMp4FileDataPtr->audioTrackPtr->currentChunk; i++ ) 33447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_dataSize += mMp4FileDataPtr->audioTrackPtr->chunkSizeTable[i]; 33467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 33477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 33497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*flush chunk*/ 33507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->currentPos > 0) 33527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4MP4W_putBlock(mMp4FileDataPtr->audioTrackPtr->Chunk[0], 33547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos, 33557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 33567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext); 33577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 33597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto cleanup; 33607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 33617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0("flush audio | CLOSE"); 33637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_2("current chunk = %d offset = 0x%x", 33647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentChunk, 33657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos); 33667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update chunk offset*/ 33687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 33697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkOffsetTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 33707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos; 33717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*add chunk size to absoluteCurrentPos*/ 33737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos += 33747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos; 33757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 33777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update last chunk size, and add this value to a_dataSize*/ 33797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 33817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSizeTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 33827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos; 33837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_dataSize += 33847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentPos; /*add last chunk size*/ 33857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* bugfix: if a new chunk was just created, cancel it before to close */ 33877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->audioTrackPtr->currentChunk != 0) 33887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->audioTrackPtr->currentPos == 0)) 33897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentChunk--; 33917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 33927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_UNBUFFERED_VIDEO 33937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 33947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->audioTrackPtr-> 33957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[mMp4FileDataPtr->audioTrackPtr-> 33967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi currentStsc] & 0xFFF) == 0) 33977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 33987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->currentStsc--; 33997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_UNBUFFERED_VIDEO*/ 34027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = mMp4FileDataPtr->audioTrackPtr-> 34047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.lastCTS; /* equals lastCTS*/ 34057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* add last sample dur */ 34067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb != 1) 34087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef DUPLICATE_STTS_IN_LAST_AU 34107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*increase of 1 the number of consecutive AUs with same duration*/ 34117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[2 34137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *(mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb 34147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1) - 2] += 1; 34157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*DUPLICATE_STTS_IN_LAST_AU*/ 34177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration += mMp4FileDataPtr->audioTrackPtr->TABLE_STTS[2 34197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * (mMp4FileDataPtr->audioTrackPtr-> 34207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1) - 1]; 34217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (0 == mMp4FileDataPtr->audioTrackPtr->CommonData.lastCTS) 34237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.trackType 34257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi == M4SYS_kAMR) 34267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (12200 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 32 34307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (10200 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 27 34357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (7950 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 21 34407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (7400 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 20 34457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (6700 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 18 34507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (5900 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 16 34557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (5150 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 14 34607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (4750 == mMp4FileDataPtr->audioTrackPtr->avgBitrate) 34637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 34647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakDuration = a_dataSize / 13 34657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * mMp4FileDataPtr->audioTrackPtr->sampleDuration; 34667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 34697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi scale_audio = 34717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1000.0 / mMp4FileDataPtr->audioTrackPtr->CommonData.timescale; 34727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_msTrakDuration = (M4OSA_UInt32)(a_trakDuration * scale_audio); 34737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 34757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* stsc update */ 34767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stscSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentStsc; 34787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentStsc; 34797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentStsc; 34807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentStsc; 34817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentStsc; 34827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentStsc; 34837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* stso update */ 34857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stcoSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 34937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*stsc/stco update*/ 34947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 34957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stscSize += 12 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stcoSize += 4 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize += 16 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize += 16 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 34997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize += 16 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 35007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize += 16 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 35017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += 16 * mMp4FileDataPtr->audioTrackPtr->currentChunk; 35027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 35047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* compute the new size of stts*/ 35067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_sttsSize = 16 + 8 * (mMp4FileDataPtr->audioTrackPtr-> 35087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.sttsTableEntryNb - 1); 35097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi moovSize += a_sttsSize - 24; 35117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_mdiaSize += a_sttsSize - 24; 35127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_minfSize += a_sttsSize - 24; 35137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_stblSize += a_sttsSize - 24; 35147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakSize += a_sttsSize - 24; 35157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*update last chunk time*/ 35177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr-> 35187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkTimeMsTable[mMp4FileDataPtr->audioTrackPtr->currentChunk] = 35197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_msTrakDuration; 35207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 35217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* changing the way the mdat size is computed. 35237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi The real purpose of the mdat size is to know the amount to skip to get to the next 35247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi atom, which is the moov; the size of media in the mdat is almost secondary. Therefore, 35257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi it is of utmost importance that the mdat size "points" to where the moov actually 35267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi begins. Now, the moov begins right after the last data we wrote, so how could the sum 35277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi of all chunk sizes be different from the total size of what has been written? Well, it 35287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi can happen when the writing was unexpectedly stopped (because of lack of disk space, 35297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for instance), in this case a chunk may be partially written (the partial write is not 35307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi necessarily erased) but it may not be reflected in the chunk size list (which may 35317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi believe it hasn't been written or on the contrary that it has been fully written). In 35327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi the case of such a mismatch, there is either unused data in the mdat (not very good, 35337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi but tolerable) or when reading the last chunk it will read the beginning of the moov 35347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi as part of the chunk (which means the last chunk won't be correctly decoded), both of 35357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi which are still better than losing the whole recording. In the long run it'll probably 35367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi be attempted to always clean up back to a consistent state, but at any rate it is 35377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi always safer to have the mdat size be computed using the position where the moov 35387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi actually begins, rather than using the size it is thought the mdat has. 35397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Therefore, I will record where we are just before writing the moov, to serve when 35417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi updating the mdat size. */ 35427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* mdatSize += a_dataSize + v_dataSize; *//*TODO allow for multiple chunks*/ 35447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* End of Pierre Lebeaupin 19/12/2007: changing the way the mdat size is computed. */ 35467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* first trak offset is 32+moovSize, second equals 32+moovSize+1st_track_size*/ 35487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakOffset += moovSize; 35497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakOffset += moovSize/*+ a_dataSize*/; 35507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bInterleaveAV == M4OSA_FALSE) 35527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakOffset += a_dataSize; 35537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*system time since 1970 */ 35557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_DONT_USE_TIME_H 35567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi time((time_t *)&creationTime); 35587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*convert into time since 1/1/1904 00h00 (normative)*/ 35597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi creationTime += 2082841761; /*nb of sec between 1904 and 1970*/ 35607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else /*_M4MP4W_DONT_USE_TIME_H*/ 35627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi creationTime = 35647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0xBBD09100; /* = 7/11/2003 00h00 ; in hexa because of code scrambler limitation with 35657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi large integers */ 35667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_DONT_USE_TIME_H*/ 35687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->duration = 35707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi max(a_msTrakDuration, v_msTrakDuration); /*max audio/video*/ 35717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 35737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*open file in write binary mode*/ 35747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = mMp4FileDataPtr->fileWriterFunctions->openWrite(&fileWriterContext, 35767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->url, 0x22); 35777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(err == M4NO_ERROR, err); 35787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*ftyp atom*/ 35807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->ftyp.major_brand != 0) 35817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 35827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 i; 35837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put customized ftyp box */ 35857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(16 35867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + (mMp4FileDataPtr->ftyp.nbCompatibleBrands * 4), 35877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 35887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext)); 35897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(M4MPAC_FTYP_TAG, 35907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 35917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext)); 35927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->ftyp.major_brand, 35937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 35947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext)); 35957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->ftyp.minor_version, 35967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 35977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext)); 35987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 35997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i < mMp4FileDataPtr->ftyp.nbCompatibleBrands; i++ ) 36007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 36017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 36027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->ftyp.compatible_brands[i], 36037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 36047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext)); 36057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 36067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 36077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 36087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 36097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put default ftyp box */ 36107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(Default_ftyp, sizeof(Default_ftyp), 36117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 36127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext)); 36137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 36147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 36167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 36187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* seek is used to get the current position relative to the start of the file. */ 36197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ... or rather, seek used to be used for that, but it has been found this functionality 36207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi is not reliably, or sometimes not at all, implemented in the various OSALs, so we now avoid 36217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi using it. */ 36227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Notice this new method assumes we're at the end of the file, this will break if ever we 36237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi are overwriting a larger file. */ 36247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(mMp4FileDataPtr->fileWriterFunctions->getOption( 36267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext, 36277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileWriteGetFileSize, (M4OSA_DataOption *) &moovPos)); 36287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* moovPos will be used after writing the moov. */ 36297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 36317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(moovSize, mMp4FileDataPtr->fileWriterFunctions, 36337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 36347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock3, sizeof(CommonBlock3), 36357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 36377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 36397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock4, sizeof(CommonBlock4), 36417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->duration, 36437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock5, sizeof(CommonBlock5), 36457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bAudio) 36487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 36497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_trakSize, 36507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock6, sizeof(CommonBlock6), 36527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 36547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 36567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_trakId, 36587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock7, sizeof(CommonBlock7), 36607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_msTrakDuration, 36627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock7bis, sizeof(CommonBlock7bis), 36647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AMRBlock1, sizeof(AMRBlock1), 36667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*audio*/ 36677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_mdiaSize, 36687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock8, sizeof(CommonBlock8), 36707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 36727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 36747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 36767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->CommonData.timescale, 36777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_trakDuration, 36797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock9, sizeof(CommonBlock9), 36817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AMRBlock1_1, sizeof(AMRBlock1_1), 36837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*audio*/ 36847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_minfSize, 36857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock10, sizeof(CommonBlock10), 36877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_stblSize, 36897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock11, sizeof(CommonBlock11), 36917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_sttsSize, 36937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock12, sizeof(CommonBlock12), 36957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 36967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 36977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 36987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb - 1, 36997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 37007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*invert the table data to bigendian*/ 37017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_table32ToBE(mMp4FileDataPtr->audioTrackPtr->TABLE_STTS, 37027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2 * (mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb 37037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi - 1)); 37047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock((const M4OSA_UChar 37057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *)mMp4FileDataPtr->audioTrackPtr->TABLE_STTS, 37067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( mMp4FileDataPtr->audioTrackPtr->CommonData.sttsTableEntryNb - 1) 37077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 8, 37087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*audio*/ 37097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 37107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* stsd */ 37117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_stsdSize, 37127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 37137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(SampleDescriptionHeader, 37147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(SampleDescriptionHeader), 37157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 37167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_esdSize, 37177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 37187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 37197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* sample desc entry inside stsd */ 37207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bAAC) 37217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 37227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AACBlock1, sizeof(AACBlock1), 37237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 37267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (bEVRC) 37277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 37287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(EVRC8Block1, sizeof(EVRC8Block1), 37297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*evrc*/ 37317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 37327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /*AMR8*/ 37337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 37347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AMR8Block1, sizeof(AMR8Block1), 37357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*amr8*/ 37377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 37387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(SampleDescriptionEntryStart, 37397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(SampleDescriptionEntryStart), 37407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 37417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AudioSampleDescEntryBoilerplate, 37427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(AudioSampleDescEntryBoilerplate), 37437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*audio*/ 37447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 37457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->CommonData.timescale 37467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi << 16, 37477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 37487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 37497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* DSI inside sample desc entry */ 37507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bAAC) 37517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 37527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_esdsSize, 37537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock0, 37567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock0), mMp4FileDataPtr->fileWriterFunctions, 37577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(a_ESDescriptorSize, 37597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock1, 37627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock1), mMp4FileDataPtr->fileWriterFunctions, 37637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(a_DCDescriptorSize, 37657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AACBlock2, sizeof(AACBlock2), 37687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 37717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE24(mMp4FileDataPtr->audioTrackPtr->avgBitrate * 5, 37727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 37757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->maxBitrate, 37767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 37797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->avgBitrate, 37807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock2, 37837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock2), mMp4FileDataPtr->fileWriterFunctions, 37847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(mMp4FileDataPtr->audioTrackPtr->dsiSize, 37867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(mMp4FileDataPtr->audioTrackPtr->DSI, 37897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->dsiSize, 37907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 37917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock3, 37937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock3), mMp4FileDataPtr->fileWriterFunctions, 37947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*aac*/ 37957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 37967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (bEVRC) 37977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 37987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 localDsi[6]; 37997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 localI; 38007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(EVRCBlock3_1, sizeof(EVRCBlock3_1), 38027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 38037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*audio*/ 38047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy the default block in a local variable*/ 38067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( localI = 0; localI < 6; localI++ ) 38077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[localI] = EVRCBlock3_2[localI]; 38097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* computes the number of sample per au */ 38117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* and stores it in the DSI*/ 38127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* assumes a char is enough to store the data*/ 38137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[5] = 38147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)(mMp4FileDataPtr->audioTrackPtr->sampleDuration 38157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / 160)/*EVRC 1 frame duration*/; 38167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL) 38187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy vendor name */ 38207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( localI = 0; localI < 4; localI++ ) 38217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[localI] = (M4OSA_UInt8)( 38237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI[localI]); 38247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(localDsi, 6, 38277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 38287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*audio*/ 38297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /*AMR8*/ 38317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 localDsi[9]; 38337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 localI; 38347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AMRDSIHeader, sizeof(AMRDSIHeader), 38367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy the default block in a local variable*/ 38397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( localI = 0; localI < 9; localI++ ) 38407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[localI] = AMRDefaultDSI[localI]; 38427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* computes the number of sample per au */ 38447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* and stores it in the DSI*/ 38457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* assumes a char is enough to store the data*/ 38467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* ALERT! The potential of the following line of code to explode in our face 38477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi is enormous when anything (sample rate or whatever) will change. This 38487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi calculation would be MUCH better handled by the VES or whatever deals with 38497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi the encoder more directly. */ 38507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[8] = 38517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)(mMp4FileDataPtr->audioTrackPtr->sampleDuration 38527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / 160)/*AMR NB 1 frame duration*/; 38537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL) 38557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy vendor name */ 38577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( localI = 0; localI < 4; localI++ ) 38587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[localI] = (M4OSA_UInt8)( 38607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI[localI]); 38617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* copy the Mode Set */ 38647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( localI = 5; localI < 7; localI++ ) 38657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi localDsi[localI] = (M4OSA_UInt8)( 38677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->DSI[localI]); 38687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(localDsi, 9, 38717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 38727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*audio*/ 38737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*end trak*/ 38767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_stszSize, 38777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock15, sizeof(CommonBlock15), 38797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 38817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize, 38827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 38847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb, 38857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*0 value for samplesize means not constant AU size*/ 38887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->audioTrackPtr->CommonData.sampleSize == 0) 38897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 38907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock((const M4OSA_UChar 38917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *)mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ, 38927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->CommonData.sampleNb * 4, 38937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 38957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 38967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_stscSize, 38977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 38987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock16, sizeof(CommonBlock16), 38997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 39027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->currentStsc 39047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1, mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->audioTrackPtr->currentStsc; i++ ) 39077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 39087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 39097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable[i] 39107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >> 12) + 1, mMp4FileDataPtr->fileWriterFunctions, 39117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 39127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32((mMp4FileDataPtr->audioTrackPtr-> 39137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[i] & 0xFFF), 39147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(1, mMp4FileDataPtr->fileWriterFunctions, 39167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 39177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 39187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 39207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->currentChunk 39227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1, mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->audioTrackPtr->currentChunk; i++ ) 39257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 39267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(i + 1, 39277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 39297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable[i], 39307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 39317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 39327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(1, mMp4FileDataPtr->fileWriterFunctions, 39337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 39347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 39357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 39377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_stcoSize, 39397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock17, sizeof(CommonBlock17), 39417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->audioTrackPtr->currentChunk 39437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1, mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 39467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->audioTrackPtr->currentChunk; i++ ) 39487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 39497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(a_trakOffset, 39507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakOffset += mMp4FileDataPtr->audioTrackPtr->chunkSizeTable[i]; 39527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( bInterleaveAV == M4OSA_TRUE) 39547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->videoTrackPtr->currentChunk >= i)) 39557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 39567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi a_trakOffset += 39577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable[i]; 39587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 39597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 39607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 39627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->audioTrackPtr->currentChunk; i++ ) 39647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 39657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 39667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable[i], 39677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 39687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 39697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 39707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 39727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(AMRBlock4, sizeof(AMRBlock4), 39747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*audio*/ 39757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 39767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bVideo) 39787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 39797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*trak*/ 39807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_trakSize, 39817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock6, sizeof(CommonBlock6), 39837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 39857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 39877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_trakId, 39897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock7, sizeof(CommonBlock7), 39917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_msTrakDuration, 39937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock7bis, sizeof(CommonBlock7bis), 39957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 39967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 39977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* In the track header width and height are 16.16 fixed point values, 39987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi so shift left the regular integer value by 16. */ 39997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->width << 16, 40007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 40017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->height 40027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi << 16, 40037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 40047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_mdiaSize, 40067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock8, sizeof(CommonBlock8), 40087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 40107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(creationTime, 40127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 40147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->CommonData.timescale, 40157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_trakDuration, 40177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock9, sizeof(CommonBlock9), 40197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(VideoBlock1_1, sizeof(VideoBlock1_1), 40217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 40227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_minfSize, 40237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock10, sizeof(CommonBlock10), 40257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_stblSize, 40277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock11, sizeof(CommonBlock11), 40297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_sttsSize, 40317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock12, sizeof(CommonBlock12), 40337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 40357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb, 40367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 40387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; 40407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i < mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb; 40417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++ ) 40427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 40437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(M4MP4W_get32_Lo( 40447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[i]), 40457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 40467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*video*/ 40477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(M4MP4W_get32_Hi( 40487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &mMp4FileDataPtr->videoTrackPtr->TABLE_STTS[i]), 40497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 40507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*video*/ 40517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 40527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 40547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock((const M4OSA_UChar 40567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *)mMp4FileDataPtr->videoTrackPtr->TABLE_STTS, 40577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( mMp4FileDataPtr->videoTrackPtr->CommonData.sttsTableEntryNb) * 8, 40587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 40597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 40617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* stsd */ 40637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_stsdSize, 40657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(SampleDescriptionHeader, 40677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(SampleDescriptionHeader), 40687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_esdSize, 40707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* sample desc entry inside stsd */ 40737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bMP4V) 40747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 40757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(Mp4vBlock1, sizeof(Mp4vBlock1), 40767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 40777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 40787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 40797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bH263) 40817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 40827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H263Block1, sizeof(H263Block1), 40837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 40847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h263*/ 40857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 40867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 40877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bH264) 40887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 40897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H264Block1, sizeof(H264Block1), 40907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 40917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h264*/ 40927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 40937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(SampleDescriptionEntryStart, 40947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(SampleDescriptionEntryStart), 40957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 40967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(SampleDescriptionEntryVideoBoilerplate1, 40977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(SampleDescriptionEntryVideoBoilerplate1), 40987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 40997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE16(mMp4FileDataPtr->videoTrackPtr->width, 41007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 41017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE16(mMp4FileDataPtr->videoTrackPtr->height, 41027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 41037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(VideoResolutions, sizeof(VideoResolutions), 41047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*mp4v*/ 41057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(SampleDescriptionEntryVideoBoilerplate2, 41067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(SampleDescriptionEntryVideoBoilerplate2), 41077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 41087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 41097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* DSI inside sample desc entry */ 41107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bH263) 41117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* The h263 dsi given through the api must be 7 bytes, that is, it shall not include 41137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi the optional bitrate box. However, if the bitrate information is set in the stream 41147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi handler, a bitrate box is appended here to the dsi */ 41157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (((M4OSA_Int32)mMp4FileDataPtr->videoTrackPtr->avgBitrate) != -1) 41167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H263Block2_bitr, 41187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(H263Block2_bitr), 41197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /* d263 box with bitr atom */ 41217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 41227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->DSI) 41237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H263Block3, sizeof(H263Block3), 41257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h263*/ 41277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 41297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 41317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->DSI, 41327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize, 41337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 41357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 41377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H263Block4, sizeof(H263Block4), 41387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h263*/ 41407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Pierre Lebeaupin 2008/04/29: the two following lines used to be swapped; 41417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi I changed to this order in order to conform to 3GPP. */ 41427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 41437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->avgBitrate, 41447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h263*/ 41467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 41477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->maxBitrate, 41487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h263*/ 41507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 41527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H263Block2, sizeof(H263Block2), 41547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /* d263 box */ 41567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 41577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL == mMp4FileDataPtr->videoTrackPtr->DSI) 41587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H263Block3, sizeof(H263Block3), 41607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h263*/ 41627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 41647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 41667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->DSI, 41677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize, 41687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 41707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 41737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 41747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bMP4V) 41757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 41767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 bufferSizeDB = 5 * mMp4FileDataPtr->videoTrackPtr-> 41777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi avgBitrate; /*bufferSizeDB set to 5 times the bitrate*/ 41787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 41797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_esdsSize, 41807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 41827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock0, 41837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock0), mMp4FileDataPtr->fileWriterFunctions, 41847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 41857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(v_ESDescriptorSize, 41867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 41887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock1, 41897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock1), mMp4FileDataPtr->fileWriterFunctions, 41907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 41917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(v_DCDescriptorSize, 41927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 41947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(Mp4vBlock3, sizeof(Mp4vBlock3), 41957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 41977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE24(bufferSizeDB, 41987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 41997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 42017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->maxBitrate, 42027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 42057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->avgBitrate, 42067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock2, 42097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock2), mMp4FileDataPtr->fileWriterFunctions, 42107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(mMp4FileDataPtr->videoTrackPtr->dsiSize, 42127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->DSI, 42157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize, 42167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(MPEGConfigBlock3, 42197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(MPEGConfigBlock3), mMp4FileDataPtr->fileWriterFunctions, 42207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*mp4v*/ 42217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 42227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bH264) 42247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 42257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 ppsLentgh = 0; /* PPS length */ 42267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 spsLentgh = 0; /* SPS length */ 42277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UChar *tmpDSI = mMp4FileDataPtr->videoTrackPtr->DSI; /* DSI */ 42287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 NumberOfPPS; 42297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt16 lCntPPS; 42307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put the avcC (header + DSI) size */ 42327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_avcCSize, 42337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h264*/ 42357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put the avcC header */ 42367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(H264Block2, sizeof(H264Block2), 42377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*h264*/ 42397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Put the DSI (SPS + PPS) int the 3gp format*/ 42407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* SPS length in BE */ 42417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0x01 != mMp4FileDataPtr->videoTrackPtr->DSI[0]) || 42437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (0x42 != mMp4FileDataPtr->videoTrackPtr->DSI[1])) 42447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 42457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_2("!!! M4MP4W_closeWrite ERROR : invalid AVCC 0x%X 0x%X", 42467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI[0], 42477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI[1]); 42487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 42497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 42507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Do not strip the DSI 42517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->DSI, 42527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize, 42537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext) );/*h264*/ 42557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 42577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*end trak*/ 42597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_stszSize, 42607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock15, sizeof(CommonBlock15), 42627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 42647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleSize, 42657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 42677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb, 42687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 42707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i < mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb; 42727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++ ) 42737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 42747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 42757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ[i], 42767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 42777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*video*/ 42787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 42797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 42817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock((const M4OSA_UChar 42837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *)mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ, 42847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->CommonData.sampleNb * 4, 42857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 42867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 42887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_stscSize, 42907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock16, sizeof(CommonBlock16), 42927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE 42957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->currentStsc 42977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1, mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 42987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 42997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->videoTrackPtr->currentStsc; i++ ) 43007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 43027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ( mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable[i] 43037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi >> 12) + 1, mMp4FileDataPtr->fileWriterFunctions, 43047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 43057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32((mMp4FileDataPtr->videoTrackPtr-> 43067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi chunkSampleNbTable[i] & 0xFFF), 43077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(1, mMp4FileDataPtr->fileWriterFunctions, 43097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 43107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 43117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 43137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->currentChunk 43157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1, mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = 0; i <= mMp4FileDataPtr->videoTrackPtr->currentChunk; i++) 43187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(i + 1, 43207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 43227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable[i], 43237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 43247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 43257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(1, mMp4FileDataPtr->fileWriterFunctions, 43267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 43277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 43287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 43307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_stcoSize, 43327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock17, sizeof(CommonBlock17), 43347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->currentChunk 43367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + 1, mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 43397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for (i = 0; i <= mMp4FileDataPtr->videoTrackPtr->currentChunk; i++) 43417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( bInterleaveAV == M4OSA_TRUE) 43437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi && (mMp4FileDataPtr->audioTrackPtr->currentChunk >= i)) 43447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakOffset += 43467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable[i]; 43477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 43487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_trakOffset, 43497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi v_trakOffset += mMp4FileDataPtr->videoTrackPtr->chunkSizeTable[i]; 43517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 43527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#else 43547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->videoTrackPtr->currentChunk; i++ ) 43567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32( 43587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable[i], 43597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 43607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 43617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 43627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 43647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(v_stssSize, 43667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 43677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(VideoBlock4, sizeof(VideoBlock4), 43687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 43697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 43707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBE32(mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb, 43717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 43727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*video*/ 43737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock((const M4OSA_UChar 43747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *)mMp4FileDataPtr->videoTrackPtr->TABLE_STSS, 43757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->stssTableEntryNb * 4, 43767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 43777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(VideoBlock5, sizeof(VideoBlock5), 43787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); /*video*/ 43797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 43807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_MOOV_FIRST 43817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*mdat*/ 43827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mdatSize, mMp4FileDataPtr->fileWriterFunctions, 43847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 43857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(CommonBlock2, sizeof(CommonBlock2), 43867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 43877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 43887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*write data, according to the interleave mode (default is not interleaved)*/ 43897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bInterleaveAV == M4OSA_FALSE) 43907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bAudio) 43927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->audioTrackPtr->currentChunk; 43947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++ ) 43957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 43967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 43977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBlock(mMp4FileDataPtr->audioTrackPtr->Chunk[i], 43987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable[i], 43997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 44007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*audio (previously a_dataSize)*/ 44017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (bVideo) 44057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= mMp4FileDataPtr->videoTrackPtr->currentChunk; 44077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i++ ) 44087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 44107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->Chunk[i], 44117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable[i], 44127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 44137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*video (previously a_dataSize)*/ 44147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else /*in this mode, we have audio and video to interleave*/ 44187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for ( i = 0; i <= max(mMp4FileDataPtr->audioTrackPtr->currentChunk, 44207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->currentChunk); i++ ) 44217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (i <= mMp4FileDataPtr->audioTrackPtr->currentChunk) 44237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 44257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBlock(mMp4FileDataPtr->audioTrackPtr->Chunk[i], 44267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->chunkSizeTable[i], 44277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 44287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*audio (previously a_dataSize)*/ 44297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (i <= mMp4FileDataPtr->videoTrackPtr->currentChunk) 44327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR( 44347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_putBlock(mMp4FileDataPtr->videoTrackPtr->Chunk[i], 44357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->chunkSizeTable[i], 44367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, 44377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); /*video (previously a_dataSize)*/ 44387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 44437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*skip*/ 44457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(BlockSignatureSkipHeader, 44477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(BlockSignatureSkipHeader), mMp4FileDataPtr->fileWriterFunctions, 44487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 44497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Write embedded string */ 44517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->embeddedString == M4OSA_NULL) 44527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(BlockSignatureSkipDefaultEmbeddedString, 44547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(BlockSignatureSkipDefaultEmbeddedString), 44557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 44587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(mMp4FileDataPtr->embeddedString, 16, 44607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Write ves core version */ 44647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi camcoder_maj = (M4OSA_UChar)(mMp4FileDataPtr->camcoderVersion / 100); 44657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi camcoder_min = 44667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UChar)(( mMp4FileDataPtr->camcoderVersion - 100 * camcoder_maj) 44677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi / 10); 44687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi camcoder_rev = 44697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UChar)(mMp4FileDataPtr->camcoderVersion - 100 * camcoder_maj - 10 44707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * camcoder_min); 44717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte(' ', mMp4FileDataPtr->fileWriterFunctions, 44737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 44747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte((M4OSA_UChar)(camcoder_maj + '0'), 44757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte('.', mMp4FileDataPtr->fileWriterFunctions, 44777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 44787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte((M4OSA_UChar)(camcoder_min + '0'), 44797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte('.', mMp4FileDataPtr->fileWriterFunctions, 44817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 44827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putByte((M4OSA_UChar)(camcoder_rev + '0'), 44837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Write integration tag */ 44867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock((const M4OSA_UChar *)" -- ", 4, 44877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 44897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->integrationTag == M4OSA_NULL) 44907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(BlockSignatureSkipDefaultIntegrationTag, 44927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi sizeof(BlockSignatureSkipDefaultIntegrationTag), 44937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 44957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 44967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 44977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBlock(mMp4FileDataPtr->integrationTag, 60, 44987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions, fileWriterContext)); 44997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef _M4MP4W_MOOV_FIRST 45027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*overwrite mdat size*/ 45037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->ftyp.major_brand != 0) 4505aa382f3637a68361989d5b70e3184bddcc472d3dhongteng mdatPos= 16 + mMp4FileDataPtr->ftyp.nbCompatibleBrands * 4; 45067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 4507aa382f3637a68361989d5b70e3184bddcc472d3dhongteng mdatPos = 24; 45087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4509aa382f3637a68361989d5b70e3184bddcc472d3dhongteng moovPos = moovPos - mdatPos; 4510aa382f3637a68361989d5b70e3184bddcc472d3dhongteng mdatSize = moovPos; 45117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(mMp4FileDataPtr->fileWriterFunctions->seek(fileWriterContext, 45137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileSeekBeginning, &mdatPos)); /*seek after ftyp...*/ 45147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CLEANUPonERR(M4MP4W_putBE32(mdatSize, mMp4FileDataPtr->fileWriterFunctions, 45157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext)); 45167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /*_M4MP4W_MOOV_FIRST*/ 45187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargicleanup: 45207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 45227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Close the file even if an error occured */ 45237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != mMp4FileDataPtr->fileWriterContext) 45247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 45257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = 45267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->closeWrite(mMp4FileDataPtr-> 45277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi fileWriterContext); /**< close the stream anyway */ 45287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err2) 45307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 45317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1( 45327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_closeWrite: fileWriterFunctions->closeWrite returns 0x%x", 45337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2); 45347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterContext = M4OSA_NULL; 45367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE 45397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Remove safety file if still present (here it is cleanup in case of error and NOT the normal 45407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi removal of the safety file to free emergency space for the moov). */ 45417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_TRUE == mMp4FileDataPtr->cleanSafetyFile) 45437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 45447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Context tempContext; 45457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err3 = mMp4FileDataPtr->fileWriterFunctions->openWrite(&tempContext, 45467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->safetyFileUrl, 45477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_kFileWrite | M4OSA_kFileCreate); 45487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err2) 45507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = err3; 45517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR 45537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != err3) /* No sense closing if we couldn't open in the first place. */ 45547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 45557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err3 = 45567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->fileWriterFunctions->closeWrite(tempContext); 45577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err2) 45597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err2 = err3; 45607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->safetyFileUrl = M4OSA_NULL; 45627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->cleanSafetyFile = M4OSA_FALSE; 45637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */ 45667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Delete embedded string */ 45687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != mMp4FileDataPtr->embeddedString) 45707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4571694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(mMp4FileDataPtr->embeddedString); 45727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->embeddedString = M4OSA_NULL; 45737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Delete integration tag */ 45767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_NULL != mMp4FileDataPtr->integrationTag) 45777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4578694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(mMp4FileDataPtr->integrationTag); 45797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->integrationTag = M4OSA_NULL; 45807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 45837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4MP4W_freeContext() is now a private method, called only from here*/ 45847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err3 = M4MP4W_freeContext(context); 45857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err3) 45877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 45887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4MP4W_closeWrite: M4MP4W_freeContext returns 0x%x", 45897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err3); 45907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 45917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 45927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 45937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Choose which error code to return */ 45947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4NO_ERROR != err) 45957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 45967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 45977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * We give priority to main error */ 45987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4MP4W_closeWrite: returning err=0x%x", err); 45997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 46007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 46017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else if (M4NO_ERROR != err2) 46027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 46037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 46047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Error from closeWrite is returned if there is no main error */ 46057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4MP4W_closeWrite: returning err2=0x%x", err2); 46067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err2; 46077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 46087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 46097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 46107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** 46117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Error from M4MP4W_freeContext is returned only if there is no main error and 46127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi no close error */ 46137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4MP4W_closeWrite: returning err3=0x%x", err3); 46147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err3; 46157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 46167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 46177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 46197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_getOption( M4OSA_Context context, M4OSA_OptionID option, 46207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DataOption *valuePtr ) 46217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 46227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 46237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 46247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamIDValue *streamIDvaluePtr = M4OSA_NULL; 46267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_StreamIDsize *streamIDsizePtr = M4OSA_NULL; 46277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_memAddr *memAddrPtr = M4OSA_NULL; 46287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* M4MP4W_WriteCallBack* callBackPtr = M4OSA_NULL;*/ 46297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 46317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 46327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(( mMp4FileDataPtr->state == M4MP4W_opened) 46347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (mMp4FileDataPtr->state == M4MP4W_ready), M4ERR_STATE); 46357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( option ) 46377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 46387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxAUperChunk): 46397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 46407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxChunkSize): 46427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)(*valuePtr); 46447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 46467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 46477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (AudioStreamID): 46487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_FALSE) 46497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 46507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 46517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = 46527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxChunkSize; 46537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 46547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (VideoStreamID): 46567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_FALSE) 46577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 46587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 46597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = 46607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxChunkSize; 46617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 46627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 46647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = mMp4FileDataPtr->MaxChunkSize; 46657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 46667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 46687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 46697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 46707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 46727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxChunkInter): 46747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)(*valuePtr); 46767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 46787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 46797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 46807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = (M4OSA_UInt32)mMp4FileDataPtr-> 46817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi InterleaveDur; /*time conversion !*/ 46827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 46837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 46857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 46867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 46877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 46887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 46897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_embeddedString): 46907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi memAddrPtr = (M4MP4W_memAddr *)(*valuePtr); 46917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*memAddrPtr must have been already allocated by the caller 46927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi and memAddrPtr->size initialized with the max possible length in bytes*/ 46937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(memAddrPtr->size >= 16, M4ERR_PARAMETER); 46947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(memAddrPtr->addr != M4OSA_NULL, M4ERR_PARAMETER); 46957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*memAddrPtr->size is updated with the actual size of the string*/ 46967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi memAddrPtr->size = 16; 46977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if no value was set, return the default string */ 46987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->embeddedString != M4OSA_NULL) 469932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)memAddrPtr->addr, 470032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->embeddedString, 16); 47017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 470232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)memAddrPtr->addr, 470332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)BlockSignatureSkipDefaultEmbeddedString, 47047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 16); 47057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_integrationTag): 47087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi memAddrPtr = (M4MP4W_memAddr *)(*valuePtr); 47097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*memAddrPtr must have been already allocated by the caller 47107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi and memAddrPtr->size initialized with the max possible length in bytes*/ 47117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(memAddrPtr->size >= 60, M4ERR_PARAMETER); 47127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(memAddrPtr->addr != M4OSA_NULL, M4ERR_PARAMETER); 47137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*memAddrPtr->size is updated with the actual size of the string*/ 47147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi memAddrPtr->size = 60; 47157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if no value was set, return the default string 0 */ 47167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->integrationTag != M4OSA_NULL) 471732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)memAddrPtr->addr, 471832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->integrationTag, 60); 47197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 472032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)memAddrPtr->addr, 472132ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)BlockSignatureSkipDefaultIntegrationTag, 47227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 60); 47237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_CamcoderVersion): 47267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)(*valuePtr); 47287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 47307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 47317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 47327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = mMp4FileDataPtr->camcoderVersion; 47337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 47367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 47377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 47387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_preWriteCallBack): 47417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 47427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*callBackPtr = (M4MP4W_WriteCallBack*)(*valuePtr); 47437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *callBackPtr = mMp4FileDataPtr->PreWriteCallBack; 47447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break;*/ 47457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_postWriteCallBack): 47477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 47487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*callBackPtr = (M4MP4W_WriteCallBack*)(*valuePtr); 47497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *callBackPtr = mMp4FileDataPtr->PostWriteCallBack; 47507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break;*/ 47517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxAUsize): 47537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)(*valuePtr); 47557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 47577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 47587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (AudioStreamID): 47597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_FALSE) 47607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 47617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 47627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = 47637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxAUSize; 47647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (VideoStreamID): 47677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_FALSE) 47687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 47697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 47707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = 47717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxAUSize; 47727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 47757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = mMp4FileDataPtr->MaxAUSize; 47767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 47797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 47807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 47817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_IOD): 47857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 47867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_ESD): 47887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 47897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_SDP): 47917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 47927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_trackSize): 47947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDsizePtr = (M4MP4W_StreamIDsize *)(*valuePtr); 47957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDsizePtr->width = mMp4FileDataPtr->videoTrackPtr->width; 47967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDsizePtr->height = mMp4FileDataPtr->videoTrackPtr->height; 47977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 47987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 47997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_estimateAudioSize): 48007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)(*valuePtr); 48017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value = 48027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt32)mMp4FileDataPtr->estimateAudioSize; 48037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 48047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_MOOVfirst): 48067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 48077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_V2_MOOF): 48097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 48107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_V2_tblCompres): 48127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 48137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 48157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_OPTION_ID; 48167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 48177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 48197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 48207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 48227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_setOption( M4OSA_Context context, M4OSA_OptionID option, 48237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_DataOption value ) 48247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 48257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 48267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 48277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamIDValue *streamIDvaluePtr = M4OSA_NULL; 48297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_StreamIDsize *streamIDsizePtr = M4OSA_NULL; 48307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_memAddr *memAddrPtr = M4OSA_NULL; 48317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamIDmemAddr *streamIDmemAddrPtr; 48327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 48347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 48357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Verify state */ 48377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( option ) 48387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 48397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4MP4W_maxFileDuration: 48407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4MP4W_DSI: 48417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* this param can be set at the end of a recording */ 48427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK((mMp4FileDataPtr->state != M4MP4W_closed), M4ERR_STATE); 48437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 48447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4MP4W_setFtypBox: 48467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* this param can only be set before starting any write */ 48477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->state == M4MP4W_opened, M4ERR_STATE); 48487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 48497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 48517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* in general params can be set at open or ready stage */ 48527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(( mMp4FileDataPtr->state == M4MP4W_opened) 48537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (mMp4FileDataPtr->state == M4MP4W_ready), M4ERR_STATE); 48547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 48557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set option */ 48577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( option ) 48587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 48597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxAUperChunk): 48607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 48617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxChunkSize): 48637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)value; 48657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 48677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 48687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (AudioStreamID): 48697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_FALSE) 48707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 48717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_BAD_STREAM_ID; /*maybe the stream has not been added yet*/ 48727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 48737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 48747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxChunkSize = 48757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 48767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 48777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 48797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (VideoStreamID): 48817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_FALSE) 48827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return 48837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_BAD_STREAM_ID; /*maybe the stream has not been added yet*/ 48847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 48857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 48867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxChunkSize = 48877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 48887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 48897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 48907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 48927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*In M4MP4W_opened state, no stream is present yet, so only global value 48947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi needs to be updated.*/ 48957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxChunkSize = streamIDvaluePtr->value; 48967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 48977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_TRUE) 48987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 48997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxChunkSize = 49007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 49017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_TRUE) 49047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 49057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxChunkSize = 49067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 49077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 49117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 49127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxChunkInter): 49167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)value; 49187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 49207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 49217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 49227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->InterleaveDur = 49237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4MP4W_Time32)streamIDvaluePtr-> 49247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi value; /*time conversion!*/ 49257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 49287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 49297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*not meaningfull to set this parameter on a streamID basis*/ 49307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxFileSize): 49347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxFileSize = *(M4OSA_UInt32 *)value; 49357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_embeddedString): 49387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi memAddrPtr = (M4MP4W_memAddr *)value; 49397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 49407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If memAddrPtr->size > 16 bytes, then the string will be truncated. 49417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If memAddrPtr->size < 16 bytes, then return M4ERR_PARAMETER 49427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 49437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(memAddrPtr->size >= 16, M4ERR_PARAMETER); 49447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->embeddedString == M4OSA_NULL) 49467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 49477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->embeddedString = 4948694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc(16, M4MP4_WRITER, 49497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"embeddedString"); 49507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->embeddedString != M4OSA_NULL, 49517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 49527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*else, just overwrite the previously set string*/ 495432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)mMp4FileDataPtr->embeddedString, 495532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)memAddrPtr->addr, 16); 49567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_integrationTag): 49597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi memAddrPtr = (M4MP4W_memAddr *)value; 49607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 49617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If memAddrPtr->size > 60 bytes, then the string will be truncated. 49627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * If memAddrPtr->size < 60 bytes, then pad with 0 49637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 49647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->integrationTag == M4OSA_NULL) 49657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 49667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->integrationTag = 4967694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar *)M4OSA_32bitAlignedMalloc(60, M4MP4_WRITER, 49687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"integrationTag"); 49697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->integrationTag != M4OSA_NULL, 49707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_ALLOC); 49717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*else, just overwrite the previously set string*/ 49737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (memAddrPtr->size < 60) 49747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 497532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)mMp4FileDataPtr->integrationTag, 497632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)BlockSignatureSkipDefaultIntegrationTag, 49777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 60); 497832ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)mMp4FileDataPtr->integrationTag, 497932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)memAddrPtr->addr, memAddrPtr->size); 49807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 49827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 498332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)mMp4FileDataPtr->integrationTag, 498432ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)memAddrPtr->addr, 60); 49857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 49867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_CamcoderVersion): 49897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)value; 49917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 49937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 49947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 49957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->camcoderVersion = streamIDvaluePtr->value; 49967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 49977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 49987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 49997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 50007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*not meaningfull to set this parameter on a streamID basis*/ 50017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 50027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_preWriteCallBack): 50057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 50067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*mMp4FileDataPtr->PreWriteCallBack = *(M4MP4W_WriteCallBack*)value; 50077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break;*/ 50087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_postWriteCallBack): 50107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 50117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*mMp4FileDataPtr->PostWriteCallBack = *(M4MP4W_WriteCallBack*)value; 50127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break;*/ 50137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxAUsize): 50157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)value; 50177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDvaluePtr->streamID ) 50197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 50207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (AudioStreamID): 50217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if (mMp4FileDataPtr->audioTrackPtr == M4OSA_NULL)*/ 50237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_FALSE) 50247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 50257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 50267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxAUSize = 50277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 50287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (VideoStreamID): 50317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*if (mMp4FileDataPtr->videoTrackPtr == M4OSA_NULL)*/ 50337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_FALSE) 50347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 50357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 50367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxAUSize = 50377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 50387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): /*all streams*/ 50417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxAUSize = streamIDvaluePtr->value; 50437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_TRUE) 50457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->audioTrackPtr->MaxAUSize = 50467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 50477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_TRUE) 50497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->MaxAUSize = 50507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr->value; 50517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 50557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 50567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 50577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_IOD): 50607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 50617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_ESD): 50637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 50647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_SDP): 50667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 50677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_trackSize): 50697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDsizePtr = (M4MP4W_StreamIDsize *)value; 50717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((streamIDsizePtr->streamID != VideoStreamID) 50737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (mMp4FileDataPtr->hasVideo == M4OSA_FALSE)) 50747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 50757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 50767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 50777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->width = streamIDsizePtr->width; 50787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->height = 50797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDsizePtr->height; 50807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 50817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_estimateAudioSize): 50847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDvaluePtr = (M4SYS_StreamIDValue *)value; 50867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*shall not set this option before audio and video streams were added*/ 50887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*nonsense to set this option if not in case audio+video*/ 50897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((mMp4FileDataPtr->hasAudio == M4OSA_FALSE) 50907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (mMp4FileDataPtr->hasVideo == M4OSA_FALSE)) 50917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 50927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->estimateAudioSize = 50947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Bool)streamIDvaluePtr->value; 50957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 50967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 50977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_MOOVfirst): 50987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 50997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_V2_MOOF): 51017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 51027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_V2_tblCompres): 51047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 51057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_maxFileDuration): 51077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->MaxFileDuration = *(M4OSA_UInt32 *)value; 51087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 51097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_setFtypBox): 51117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 size; 51137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(( (M4MP4C_FtypBox *)value)->major_brand != 0, 51157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 51167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Copy structure */ 51187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->ftyp = *(M4MP4C_FtypBox *)value; 51197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update global position variables with the difference between common and 51217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi user block */ 51227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi size = 51237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->ftyp.nbCompatibleBrands * sizeof(M4OSA_UInt32); 51247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->absoluteCurrentPos = 8/*mdat*/ + 16 + size; 51267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize = 218/*mdat+moov+skip*/ + 16 + size; 51277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 51287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 51297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (M4MP4W_DSI): 51317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr = (M4SYS_StreamIDmemAddr *)value; 51337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Nested switch! Whee! */ 51357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamIDmemAddrPtr->streamID ) 51367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (AudioStreamID): 51387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_NOT_IMPLEMENTED; 51397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (VideoStreamID): 51417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Protect DSI setting : only once allowed on a given stream */ 51437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( mMp4FileDataPtr->videoTrackPtr-> 51457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi CommonData.trackType ) 51467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kH263: 51487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0 != mMp4FileDataPtr->videoTrackPtr->dsiSize) 51497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 51507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != mMp4FileDataPtr->videoTrackPtr->DSI)) 51517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 51537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_setOption: dsi already set !"); 51547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 51557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 51567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0 == streamIDmemAddrPtr->size) 51587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == streamIDmemAddrPtr->addr)) 51597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 51617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_setOption: Bad H263 dsi!"); 51627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 51637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 51647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*decoder specific info size is supposed to be always 7 51667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi bytes long */ 51677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamIDmemAddrPtr->size == 7, 51687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 51697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 51707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamIDmemAddrPtr->size; 51717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = (M4OSA_UChar 5172694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(streamIDmemAddrPtr->size, 51737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 51747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI 51757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 517632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 517732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr-> 51787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi DSI, 517932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamIDmemAddrPtr->addr, 51807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr->size); 51817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 51837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kMPEG_4: 51857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0 != mMp4FileDataPtr->videoTrackPtr->dsiSize) 51867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 51877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != mMp4FileDataPtr->videoTrackPtr->DSI)) 51887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 51907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_setOption: dsi already set !"); 51917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 51927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 51937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 51947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0 == streamIDmemAddrPtr->size) 51957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == streamIDmemAddrPtr->addr)) 51967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 51977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 51987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_setOption: Bad MPEG4 dsi!"); 51997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 52007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /*MP4V specific*/ 52037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(streamIDmemAddrPtr->size < 105, 52047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_PARAMETER); 52057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 52067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamIDmemAddrPtr->size; 52077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = (M4OSA_UChar 5208694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(streamIDmemAddrPtr->size, 52097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 52107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI 52117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 521232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 521332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr-> 52147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi DSI, 521532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamIDmemAddrPtr->addr, 52167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr->size); 52177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->filesize += 52187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr->size; 52197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 52217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4SYS_kH264: 52237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((0 != mMp4FileDataPtr->videoTrackPtr->dsiSize) 52247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL 52257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != mMp4FileDataPtr->videoTrackPtr->DSI)) 52267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 52277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* + H.264 trimming */ 52287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (M4OSA_TRUE == mMp4FileDataPtr->bMULPPSSPS) 52297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5230694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(mMp4FileDataPtr->videoTrackPtr->DSI); 52317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi // Do not strip the DSI 52337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Store the DSI size */ 52347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 52357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamIDmemAddrPtr->size; 52367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_1("M4MP4W_setOption: in set option DSI size =%d"\ 52377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ,mMp4FileDataPtr->videoTrackPtr->dsiSize); 52387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Copy the DSI (SPS + PPS) */ 52397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = 5240694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu (M4OSA_UChar*)M4OSA_32bitAlignedMalloc( 52417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr->size, M4MP4_WRITER, 52427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_Char *)"videoTrackPtr->DSI"); 52437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI != 52447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_NULL, M4ERR_ALLOC); 524532ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 524632ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr->DSI, 524732ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamIDmemAddrPtr->addr, 52487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr->size); 52497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 52517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* - H.264 trimming */ 52527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 52547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 52557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 52567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_setOption: dsi already set !"); 52577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 52587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (( 0 == streamIDmemAddrPtr->size) 52627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi || (M4OSA_NULL == streamIDmemAddrPtr->addr)) 52637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 52647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_TRACE1_0( 52657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi "M4MP4W_setOption: Bad H264 dsi!"); 52667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 52677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Store the DSI size */ 52707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->dsiSize = 52717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (M4OSA_UInt8)streamIDmemAddrPtr->size; 52727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Copy the DSI (SPS + PPS) */ 52747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->videoTrackPtr->DSI = (M4OSA_UChar 5275694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu *)M4OSA_32bitAlignedMalloc(streamIDmemAddrPtr->size, 52767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4_WRITER, (M4OSA_Char *)"videoTrackPtr->DSI"); 52777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(mMp4FileDataPtr->videoTrackPtr->DSI 52787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi != M4OSA_NULL, M4ERR_ALLOC); 527932ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy( 528032ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)mMp4FileDataPtr->videoTrackPtr-> 52817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi DSI, 528232ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu (void *)streamIDmemAddrPtr->addr, 52837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi streamIDmemAddrPtr->size); 52847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 52857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 52877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 52887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 52907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 52917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 52927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 52937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 52957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 52967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* H.264 Trimming */ 52977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4MP4W_MUL_PPS_SPS: 52987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi mMp4FileDataPtr->bMULPPSSPS = *(M4OSA_Int8 *)value; 52997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* H.264 Trimming */ 53007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 53017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 53037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_OPTION_ID; 53047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 53057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 53077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 53087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 53107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_getState( M4OSA_Context context, M4MP4W_State *state, 53117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4SYS_StreamID streamID ) 53127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 53137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 53147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 53157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 53177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 53187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch( streamID ) 53207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 53217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (0): 53227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *state = mMp4FileDataPtr->state; 53237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 53247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (AudioStreamID): 53267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasAudio == M4OSA_TRUE) 53277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 53287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *state = mMp4FileDataPtr->audioTrackPtr->microState; 53297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 53307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 53317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 53327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 53337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 53347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 53357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case (VideoStreamID): 53377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (mMp4FileDataPtr->hasVideo == M4OSA_TRUE) 53387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 53397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *state = mMp4FileDataPtr->videoTrackPtr->microState; 53407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 53417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 53427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 53437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 53447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 53457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 53467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 53487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_BAD_STREAM_ID; 53497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 53507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 53527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 53537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 53557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4MP4W_getCurrentFileSize( M4OSA_Context context, 53567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 *pCurrentFileSize ) 53577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*******************************************************************************/ 53587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 53597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR; 53607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4MP4W_Mp4FileData *mMp4FileDataPtr = (M4MP4W_Mp4FileData *)context; 53627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); 53637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ERR_CHECK(pCurrentFileSize != M4OSA_NULL, M4ERR_PARAMETER); 53657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pCurrentFileSize = mMp4FileDataPtr->filesize; 53667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err; 53687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 53697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 53707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif /* _M4MP4W_USE_CST_MEMORY_WRITER */ 5371