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