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