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*************************************************************************
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @file   VideoEditorUtils.cpp
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi* @brief  StageFright shell Utilities
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*************************************************************************
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_NDEBUG 0
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define LOG_TAG "SF_utils"
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "utils/Log.h"
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "VideoEditorUtils.h"
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
29c4689fae1bdb8d1c94eb28af1b2a1f30d2b1a3daJames Dong#include <media/stagefright/foundation/ADebug.h>
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaErrors.h>
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaExtractor.h>
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MediaBuffer.h>
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/MetaData.h>
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <media/stagefright/OMXCodec.h>
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Android includes*/
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <utils/Log.h>
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include <memory.h>
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*---------------------*/
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*  DEBUG LEVEL SETUP  */
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/*---------------------*/
43f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block#define LOG1 ALOGE    /*ERRORS Logging*/
44ec9e663f697df4254dacc79f52cdb633179c92abSteve Block#define LOG2 ALOGI    /*WARNING Logging*/
452703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block#define LOG3 //ALOGV  /*COMMENTS Logging*/
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundarginamespace android {
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargivoid displayMetaData(const sp<MetaData> meta) {
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const char* charData;
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t int32Data;
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int64_t int64Data;
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint32_t type;
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const void* data;
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    void* ptr;
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t size;
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyMIMEType, &charData)) {
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyMIMEType %s", charData);
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyWidth, &int32Data)) {
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyWidth %d", int32Data);
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyHeight, &int32Data)) {
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyHeight %d", int32Data);
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyIFramesInterval, &int32Data)) {
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyIFramesInterval %d", int32Data);
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyStride, &int32Data)) {
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyStride %d", int32Data);
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeySliceHeight, &int32Data)) {
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeySliceHeight %d", int32Data);
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyChannelCount, &int32Data)) {
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyChannelCount %d", int32Data);
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeySampleRate, &int32Data)) {
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeySampleRate %d", int32Data);
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyBitRate, &int32Data)) {
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyBitRate %d", int32Data);
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findData(kKeyESDS, &type, &data, &size)) {
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyESDS type=%d size=%d", type, size);
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findData(kKeyAVCC, &type, &data, &size)) {
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyAVCC data=0x%X type=%d size=%d",
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            *((unsigned int*)data), type, size);
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) {
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyVorbisInfo type=%d size=%d", type, size);
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findData(kKeyVorbisBooks, &type, &data, &size)) {
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyVorbisBooks type=%d size=%d", type, size);
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyWantsNALFragments, &int32Data)) {
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyWantsNALFragments %d", int32Data);
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyIsSyncFrame, &int32Data)) {
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyIsSyncFrame %d", int32Data);
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyIsCodecConfig, &int32Data)) {
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyIsCodecConfig %d", int32Data);
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt64(kKeyTime, &int64Data)) {
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyTime %lld", int64Data);
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyDuration, &int32Data)) {
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyDuration %d", int32Data);
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyColorFormat, &int32Data)) {
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyColorFormat %d", int32Data);
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findPointer(kKeyPlatformPrivate, &ptr)) {
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyPlatformPrivate pointer=0x%x", (int32_t) ptr);
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyDecoderComponent, &charData)) {
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyDecoderComponent %s", charData);
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyBufferID, &int32Data)) {
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyBufferID %d", int32Data);
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyMaxInputSize, &int32Data)) {
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyMaxInputSize %d", int32Data);
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt64(kKeyThumbnailTime, &int64Data)) {
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyThumbnailTime %lld", int64Data);
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyAlbum, &charData)) {
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyAlbum %s", charData);
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyArtist, &charData)) {
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyArtist %s", charData);
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyAlbumArtist, &charData)) {
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyAlbumArtist %s", charData);
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyComposer, &charData)) {
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyComposer %s", charData);
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyGenre, &charData)) {
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyGenre %s", charData);
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyTitle, &charData)) {
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyTitle %s", charData);
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyYear, &charData)) {
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyYear %s", charData);
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findData(kKeyAlbumArt, &type, &data, &size)) {
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyAlbumArt type=%d size=%d", type, size);
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyAlbumArtMIME, &charData)) {
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyAlbumArtMIME %s", charData);
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyAuthor, &charData)) {
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyAuthor %s", charData);
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyCDTrackNumber, &charData)) {
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyCDTrackNumber %s", charData);
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyDiscNumber, &charData)) {
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyDiscNumber %s", charData);
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyDate, &charData)) {
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyDate %s", charData);
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findCString(kKeyWriter, &charData)) {
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyWriter %s", charData);
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyTimeScale, &int32Data)) {
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyTimeScale %d", int32Data);
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyVideoProfile, &int32Data)) {
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyVideoProfile %d", int32Data);
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyVideoLevel, &int32Data)) {
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyVideoLevel %d", int32Data);
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKey64BitFileOffset, &int32Data)) {
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKey64BitFileOffset %d", int32Data);
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyFileType, &int32Data)) {
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyFileType %d", int32Data);
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt64(kKeyTrackTimeStatus, &int64Data)) {
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyTrackTimeStatus %lld", int64Data);
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (meta->findInt32(kKeyNotRealTime, &int32Data)) {
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        LOG1("displayMetaData kKeyNotRealTime %d", int32Data);
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * This code was extracted from StageFright MPEG4 writer
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Is is used to parse and format the AVC codec specific info received
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * from StageFright encoders
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic const uint8_t kNalUnitTypeSeqParamSet = 0x07;
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatic const uint8_t kNalUnitTypePicParamSet = 0x08;
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistruct AVCParamSet {
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    AVCParamSet(uint16_t length, const uint8_t *data)
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        : mLength(length), mData(data) {}
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint16_t mLength;
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const uint8_t *mData;
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistruct AVCCodecSpecificContext {
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    List<AVCParamSet> mSeqParamSets;
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    List<AVCParamSet> mPicParamSets;
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint8_t mProfileIdc;
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint8_t mProfileCompatible;
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint8_t mLevelIdc;
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi};
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargiconst uint8_t *parseParamSet(AVCCodecSpecificContext* pC,
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const uint8_t *data, size_t length, int type, size_t *paramSetLen) {
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    CHECK(type == kNalUnitTypeSeqParamSet ||
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi          type == kNalUnitTypePicParamSet);
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t bytesLeft = length;
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while (bytesLeft > 4  &&
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            memcmp("\x00\x00\x00\x01", &data[length - bytesLeft], 4)) {
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        --bytesLeft;
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (bytesLeft <= 4) {
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bytesLeft = 0; // Last parameter set
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const uint8_t *nextStartCode = &data[length - bytesLeft];
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *paramSetLen = nextStartCode - data;
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (*paramSetLen == 0) {
235f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("Param set is malformed, since its length is 0");
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return NULL;
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    AVCParamSet paramSet(*paramSetLen, data);
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (type == kNalUnitTypeSeqParamSet) {
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (*paramSetLen < 4) {
242f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Seq parameter set malformed");
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return NULL;
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (pC->mSeqParamSets.empty()) {
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mProfileIdc = data[1];
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mProfileCompatible = data[2];
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pC->mLevelIdc = data[3];
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (pC->mProfileIdc != data[1] ||
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mProfileCompatible != data[2] ||
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pC->mLevelIdc != data[3]) {
2532703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block                ALOGV("Inconsistent profile/level found in seq parameter sets");
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return NULL;
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mSeqParamSets.push_back(paramSet);
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pC->mPicParamSets.push_back(paramSet);
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return nextStartCode;
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargistatus_t buildAVCCodecSpecificData(uint8_t **pOutputData, size_t *pOutputSize,
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        const uint8_t *data, size_t size, MetaData *param)
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
2672703f23af496c13cfa39cc7e157fa12d1cb4c169Steve Block    //ALOGV("buildAVCCodecSpecificData");
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if ( (pOutputData == NULL) || (pOutputSize == NULL) ) {
270f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("output is invalid");
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return ERROR_MALFORMED;
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (*pOutputData != NULL) {
275f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("Already have codec specific data");
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return ERROR_MALFORMED;
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (size < 4) {
280f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        ALOGE("Codec specific data length too short: %d", size);
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return ERROR_MALFORMED;
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Data is in the form of AVCCodecSpecificData
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (memcmp("\x00\x00\x00\x01", data, 4)) {
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // 2 bytes for each of the parameter set length field
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // plus the 7 bytes for the header
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (size < 4 + 7) {
289f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Codec specific data length too short: %d", size);
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pOutputSize = size;
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        *pOutputData = (uint8_t*)malloc(size);
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        memcpy(*pOutputData, data, size);
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return OK;
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    AVCCodecSpecificContext ctx;
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint8_t *outputData = NULL;
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t outputSize = 0;
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // Check if the data is valid
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint8_t type = kNalUnitTypeSeqParamSet;
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bool gotSps = false;
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    bool gotPps = false;
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const uint8_t *tmp = data;
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    const uint8_t *nextStartCode = data;
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t bytesLeft = size;
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    size_t paramSetLen = 0;
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    outputSize = 0;
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    while (bytesLeft > 4 && !memcmp("\x00\x00\x00\x01", tmp, 4)) {
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        type = (*(tmp + 4)) & 0x1F;
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (type == kNalUnitTypeSeqParamSet) {
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (gotPps) {
316f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("SPS must come before PPS");
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return ERROR_MALFORMED;
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!gotSps) {
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                gotSps = true;
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            nextStartCode = parseParamSet(&ctx, tmp + 4, bytesLeft - 4, type,
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &paramSetLen);
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else if (type == kNalUnitTypePicParamSet) {
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!gotSps) {
326f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block                ALOGE("SPS must come before PPS");
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                return ERROR_MALFORMED;
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!gotPps) {
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                gotPps = true;
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            nextStartCode = parseParamSet(&ctx, tmp + 4, bytesLeft - 4, type,
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                &paramSetLen);
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } else {
335f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Only SPS and PPS Nal units are expected");
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nextStartCode == NULL) {
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Move on to find the next parameter set
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        bytesLeft -= nextStartCode - tmp;
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        tmp = nextStartCode;
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        outputSize += (2 + paramSetLen);
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Check on the number of seq parameter sets
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        size_t nSeqParamSets = ctx.mSeqParamSets.size();
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nSeqParamSets == 0) {
353f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Cound not find sequence parameter set");
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nSeqParamSets > 0x1F) {
358f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Too many seq parameter sets (%d) found", nSeqParamSets);
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // Check on the number of pic parameter sets
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        size_t nPicParamSets = ctx.mPicParamSets.size();
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nPicParamSets == 0) {
367f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Cound not find picture parameter set");
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (nPicParamSets > 0xFF) {
371f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block            ALOGE("Too many pic parameter sets (%d) found", nPicParamSets);
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            return ERROR_MALFORMED;
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // ISO 14496-15: AVC file format
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    outputSize += 7;  // 7 more bytes in the header
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    outputData = (uint8_t *)malloc(outputSize);
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    uint8_t *header = outputData;
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header[0] = 1;                     // version
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header[1] = ctx.mProfileIdc;           // profile indication
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header[2] = ctx.mProfileCompatible;    // profile compatibility
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header[3] = ctx.mLevelIdc;
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // 6-bit '111111' followed by 2-bit to lengthSizeMinuusOne
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int32_t use2ByteNalLength = 0;
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (param &&
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        param->findInt32(kKey2ByteNalLength, &use2ByteNalLength) &&
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        use2ByteNalLength) {
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header[4] = 0xfc | 1;  // length size == 2 bytes
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    } else {
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header[4] = 0xfc | 3;  // length size == 4 bytes
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // 3-bit '111' followed by 5-bit numSequenceParameterSets
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int nSequenceParamSets = ctx.mSeqParamSets.size();
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header[5] = 0xe0 | nSequenceParamSets;
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header += 6;
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for (List<AVCParamSet>::iterator it = ctx.mSeqParamSets.begin();
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         it != ctx.mSeqParamSets.end(); ++it) {
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // 16-bit sequence parameter set length
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uint16_t seqParamSetLength = it->mLength;
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header[0] = seqParamSetLength >> 8;
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header[1] = seqParamSetLength & 0xff;
405f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block        //ALOGE("### SPS %d %d %d", seqParamSetLength, header[0], header[1]);
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // SPS NAL unit (sequence parameter length bytes)
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        memcpy(&header[2], it->mData, seqParamSetLength);
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header += (2 + seqParamSetLength);
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    // 8-bit nPictureParameterSets
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    int nPictureParamSets = ctx.mPicParamSets.size();
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header[0] = nPictureParamSets;
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    header += 1;
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for (List<AVCParamSet>::iterator it = ctx.mPicParamSets.begin();
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi         it != ctx.mPicParamSets.end(); ++it) {
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // 16-bit picture parameter set length
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        uint16_t picParamSetLength = it->mLength;
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header[0] = picParamSetLength >> 8;
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header[1] = picParamSetLength & 0xff;
422f8bd29c66308c820d579b3efb0942a53a277e2c5Steve Block//ALOGE("### PPS %d %d %d", picParamSetLength, header[0], header[1]);
4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        // PPS Nal unit (picture parameter set length bytes)
4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        memcpy(&header[2], it->mData, picParamSetLength);
4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        header += (2 + picParamSetLength);
4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pOutputSize = outputSize;
4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    *pOutputData = outputData;
4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return OK;
4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}// namespace android
434