MetaDataUtils.cpp revision 3d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0
17dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang/* 27dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * Copyright 2018 The Android Open Source Project 37dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * 47dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * Licensed under the Apache License, Version 2.0 (the "License"); 57dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * you may not use this file except in compliance with the License. 67dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * You may obtain a copy of the License at 77dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * 87dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * http://www.apache.org/licenses/LICENSE-2.0 97dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * 107dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * Unless required by applicable law or agreed to in writing, software 117dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * distributed under the License is distributed on an "AS IS" BASIS, 127dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * See the License for the specific language governing permissions and 147dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang * limitations under the License. 157dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang */ 167dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 177dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang//#define LOG_NDEBUG 0 187dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang#define LOG_TAG "MetaDataUtils" 197dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 207dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang#include <media/stagefright/foundation/avc_utils.h> 217dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang#include <media/stagefright/foundation/ABuffer.h> 227dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang#include <media/stagefright/MediaDefs.h> 237dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang#include <media/stagefright/MetaDataUtils.h> 247dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 257dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kangnamespace android { 267dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 273d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenbool MakeAVCCodecSpecificData(MetaDataBase &meta, const sp<ABuffer> &accessUnit) { 287dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang int32_t width; 297dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang int32_t height; 307dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang int32_t sarWidth; 317dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang int32_t sarHeight; 327dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang sp<ABuffer> csd = MakeAVCCodecSpecificData(accessUnit, &width, &height, &sarWidth, &sarHeight); 337dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang if (csd == nullptr) { 343d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return false; 357dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang } 363d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 377dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 383d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setData(kKeyAVCC, kTypeAVCC, csd->data(), csd->size()); 393d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setInt32(kKeyWidth, width); 403d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setInt32(kKeyHeight, height); 417dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang if (sarWidth > 0 && sarHeight > 0) { 423d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setInt32(kKeySARWidth, sarWidth); 433d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setInt32(kKeySARHeight, sarHeight); 447dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang } 453d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return true; 467dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang} 477dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 483d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissenbool MakeAACCodecSpecificData( 493d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase &meta, 507dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang unsigned profile, unsigned sampling_freq_index, 517dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang unsigned channel_configuration) { 52fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen if(sampling_freq_index > 11u) { 533d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return false; 547dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang } 55fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen int32_t sampleRate; 56fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen int32_t channelCount; 57fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen static const int32_t kSamplingFreq[] = { 58fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 59fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 16000, 12000, 11025, 8000 60fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen }; 61fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen sampleRate = kSamplingFreq[sampling_freq_index]; 62fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen channelCount = channel_configuration; 63fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 64fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen static const uint8_t kStaticESDS[] = { 65fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x03, 22, 66fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x00, 0x00, // ES_ID 67fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x00, // streamDependenceFlag, URL_Flag, OCRstreamFlag 68fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 69fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x04, 17, 70fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x40, // Audio ISO/IEC 14496-3 71fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x00, 0x00, 0x00, 0x00, 72fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x00, 0x00, 0x00, 0x00, 73fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x00, 0x00, 0x00, 0x00, 74fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 75fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 0x05, 2, 76fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen // AudioSpecificInfo follows 77fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 78fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen // oooo offf fccc c000 79fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen // o - audioObjectType 80fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen // f - samplingFreqIndex 81fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen // c - channelConfig 82fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen }; 83fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 84fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen size_t csdSize = sizeof(kStaticESDS) + 2; 85fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen uint8_t *csd = new uint8_t[csdSize]; 86fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen memcpy(csd, kStaticESDS, sizeof(kStaticESDS)); 87fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 88fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen csd[sizeof(kStaticESDS)] = 89fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen ((profile + 1) << 3) | (sampling_freq_index >> 1); 90fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 91fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen csd[sizeof(kStaticESDS) + 1] = 92fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen ((sampling_freq_index << 7) & 0x80) | (channel_configuration << 3); 93fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen 943d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC); 957dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 963d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setInt32(kKeySampleRate, sampleRate); 973d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setInt32(kKeyChannelCount, channelCount); 987dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 993d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen meta.setData(kKeyESDS, 0, csd, csdSize); 100fca6559a72ee52648133ea5220be85960a3560e0Marco Nelissen delete [] csd; 1013d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen return true; 1027dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang} 1037dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang 1047dc218e17800cc3ac95551e3280820f407adf7b5Dongwon Kang} // namespace android 105