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 ¶mSetLen); 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 ¶mSetLen); 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