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