RemoteMediaExtractor.cpp revision 92d23b433bd770c22c2d4a30b573602f5565de1b
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 const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin) 41 :mExtractor(extractor), 42 mExtractorPlugin(plugin) { 43 44 mAnalyticsItem = nullptr; 45 if (MEDIA_LOG) { 46 mAnalyticsItem = new MediaAnalyticsItem(kKeyExtractor); 47 48 // track the container format (mpeg, aac, wvm, etc) 49 size_t ntracks = extractor->countTracks(); 50 mAnalyticsItem->setCString(kExtractorFormat, extractor->name()); 51 // tracks (size_t) 52 mAnalyticsItem->setInt32(kExtractorTracks, ntracks); 53 // metadata 54 sp<MetaData> pMetaData = extractor->getMetaData(); 55 if (pMetaData != nullptr) { 56 String8 xx = pMetaData->toString(); 57 // 'titl' -- but this verges into PII 58 // 'mime' 59 const char *mime = nullptr; 60 if (pMetaData->findCString(kKeyMIMEType, &mime)) { 61 mAnalyticsItem->setCString(kExtractorMime, mime); 62 } 63 // what else is interesting and not already available? 64 } 65 } 66} 67 68RemoteMediaExtractor::~RemoteMediaExtractor() { 69 mExtractor = nullptr; 70 mExtractorPlugin = nullptr; 71 // log the current record, provided it has some information worth recording 72 if (MEDIA_LOG) { 73 if (mAnalyticsItem != nullptr) { 74 if (mAnalyticsItem->count() > 0) { 75 mAnalyticsItem->selfrecord(); 76 } 77 } 78 } 79 if (mAnalyticsItem != nullptr) { 80 delete mAnalyticsItem; 81 mAnalyticsItem = nullptr; 82 } 83} 84 85size_t RemoteMediaExtractor::countTracks() { 86 return mExtractor->countTracks(); 87} 88 89sp<IMediaSource> RemoteMediaExtractor::getTrack(size_t index) { 90 sp<MediaSource> source = mExtractor->getTrack(index); 91 return (source.get() == nullptr) 92 ? nullptr : CreateIMediaSourceFromMediaSource(source, mExtractorPlugin); 93} 94 95sp<MetaData> RemoteMediaExtractor::getTrackMetaData(size_t index, uint32_t flags) { 96 return mExtractor->getTrackMetaData(index, flags); 97} 98 99sp<MetaData> RemoteMediaExtractor::getMetaData() { 100 return mExtractor->getMetaData(); 101} 102 103status_t RemoteMediaExtractor::getMetrics(Parcel *reply) { 104 if (mAnalyticsItem == nullptr || reply == nullptr) { 105 return UNKNOWN_ERROR; 106 } 107 108 mAnalyticsItem->writeToParcel(reply); 109 return OK; 110} 111 112uint32_t RemoteMediaExtractor::flags() const { 113 return mExtractor->flags(); 114} 115 116char* RemoteMediaExtractor::getDrmTrackInfo(size_t trackID, int * len) { 117 return mExtractor->getDrmTrackInfo(trackID, len); 118} 119 120void RemoteMediaExtractor::setUID(uid_t uid) { 121 return mExtractor->setUID(uid); 122} 123 124status_t RemoteMediaExtractor::setMediaCas(const HInterfaceToken &casToken) { 125 return mExtractor->setMediaCas(casToken); 126} 127 128const char * RemoteMediaExtractor::name() { 129 return mExtractor->name(); 130} 131 132void RemoteMediaExtractor::release() { 133 return mExtractor->release(); 134} 135 136//////////////////////////////////////////////////////////////////////////////// 137 138// static 139sp<IMediaExtractor> RemoteMediaExtractor::wrap( 140 const sp<MediaExtractor> &extractor, const sp<RefBase> &plugin) { 141 if (extractor.get() == nullptr) { 142 return nullptr; 143 } 144 return new RemoteMediaExtractor(extractor, plugin); 145} 146 147} // namespace android 148