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