RemoteMediaExtractor.cpp revision 2a243f08193fe9ff1afe018e9953f01c44ced9de
1/* 2 * Copyright 2017, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17//#define LOG_NDEBUG 0 18#define LOG_TAG "RemoteMediaExtractor" 19#include <utils/Log.h> 20 21#include <media/stagefright/InterfaceUtils.h> 22#include <media/MediaAnalyticsItem.h> 23#include <media/MediaSource.h> 24#include <media/stagefright/RemoteMediaExtractor.h> 25 26// still doing some on/off toggling here. 27#define MEDIA_LOG 1 28 29namespace android { 30 31// key for media statistics 32static const char *kKeyExtractor = "extractor"; 33 34// attrs for media statistics 35static const char *kExtractorMime = "android.media.mediaextractor.mime"; 36static const char *kExtractorTracks = "android.media.mediaextractor.ntrk"; 37static const char *kExtractorFormat = "android.media.mediaextractor.fmt"; 38 39RemoteMediaExtractor::RemoteMediaExtractor( 40 MediaExtractor *extractor, 41 const sp<DataSource> &source, 42 const sp<RefBase> &plugin) 43 :mExtractor(extractor), 44 mSource(source), 45 mExtractorPlugin(plugin) { 46 47 mAnalyticsItem = nullptr; 48 if (MEDIA_LOG) { 49 mAnalyticsItem = new MediaAnalyticsItem(kKeyExtractor); 50 51 // track the container format (mpeg, aac, wvm, etc) 52 size_t ntracks = extractor->countTracks(); 53 mAnalyticsItem->setCString(kExtractorFormat, extractor->name()); 54 // tracks (size_t) 55 mAnalyticsItem->setInt32(kExtractorTracks, ntracks); 56 // metadata 57 sp<MetaData> pMetaData = extractor->getMetaData(); 58 if (pMetaData != nullptr) { 59 String8 xx = pMetaData->toString(); 60 // 'titl' -- but this verges into PII 61 // 'mime' 62 const char *mime = nullptr; 63 if (pMetaData->findCString(kKeyMIMEType, &mime)) { 64 mAnalyticsItem->setCString(kExtractorMime, mime); 65 } 66 // what else is interesting and not already available? 67 } 68 } 69} 70 71RemoteMediaExtractor::~RemoteMediaExtractor() { 72 delete mExtractor; 73 mSource->close(); 74 mSource.clear(); 75 mExtractorPlugin = nullptr; 76 // log the current record, provided it has some information worth recording 77 if (MEDIA_LOG) { 78 if (mAnalyticsItem != nullptr) { 79 if (mAnalyticsItem->count() > 0) { 80 mAnalyticsItem->selfrecord(); 81 } 82 } 83 } 84 if (mAnalyticsItem != nullptr) { 85 delete mAnalyticsItem; 86 mAnalyticsItem = nullptr; 87 } 88} 89 90size_t RemoteMediaExtractor::countTracks() { 91 return mExtractor->countTracks(); 92} 93 94sp<IMediaSource> RemoteMediaExtractor::getTrack(size_t index) { 95 MediaSourceBase *source = mExtractor->getTrack(index); 96 return (source == nullptr) 97 ? nullptr : CreateIMediaSourceFromMediaSourceBase(this, source, mExtractorPlugin); 98} 99 100sp<MetaData> RemoteMediaExtractor::getTrackMetaData(size_t index, uint32_t flags) { 101 return mExtractor->getTrackMetaData(index, flags); 102} 103 104sp<MetaData> RemoteMediaExtractor::getMetaData() { 105 return mExtractor->getMetaData(); 106} 107 108status_t RemoteMediaExtractor::getMetrics(Parcel *reply) { 109 if (mAnalyticsItem == nullptr || reply == nullptr) { 110 return UNKNOWN_ERROR; 111 } 112 113 mAnalyticsItem->writeToParcel(reply); 114 return OK; 115} 116 117uint32_t RemoteMediaExtractor::flags() const { 118 return mExtractor->flags(); 119} 120 121char* RemoteMediaExtractor::getDrmTrackInfo(size_t trackID, int * len) { 122 return mExtractor->getDrmTrackInfo(trackID, len); 123} 124 125void RemoteMediaExtractor::setUID(uid_t uid) { 126 return mExtractor->setUID(uid); 127} 128 129status_t RemoteMediaExtractor::setMediaCas(const HInterfaceToken &casToken) { 130 return mExtractor->setMediaCas(casToken); 131} 132 133const char * RemoteMediaExtractor::name() { 134 return mExtractor->name(); 135} 136 137//////////////////////////////////////////////////////////////////////////////// 138 139// static 140sp<IMediaExtractor> RemoteMediaExtractor::wrap( 141 MediaExtractor *extractor, 142 const sp<DataSource> &source, 143 const sp<RefBase> &plugin) { 144 if (extractor == nullptr) { 145 return nullptr; 146 } 147 return new RemoteMediaExtractor(extractor, source, plugin); 148} 149 150} // namespace android 151