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