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