WVMExtractor.cpp revision b371426ce4cf2fa6d8c3d1903b61322feb165d35
1b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang/*
2b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * Copyright (C) 2010 The Android Open Source Project
3b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang *
4b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * Licensed under the Apache License, Version 2.0 (the "License");
5b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * you may not use this file except in compliance with the License.
6b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * You may obtain a copy of the License at
7b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang *
8b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang *      http://www.apache.org/licenses/LICENSE-2.0
9b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang *
10b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * Unless required by applicable law or agreed to in writing, software
11b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * distributed under the License is distributed on an "AS IS" BASIS,
12b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * See the License for the specific language governing permissions and
14b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * limitations under the License.
15b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang */
16b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
17b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#define LOG_TAG "WVMExtractor"
18b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <utils/Log.h>
19b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
20b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include "include/WVMExtractor.h"
21b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
22b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <arpa/inet.h>
23b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <utils/String8.h>
24b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/Utils.h>
25b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/DataSource.h>
26b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaSource.h>
27b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaDefs.h>
28b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MetaData.h>
29b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaErrors.h>
30b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaBuffer.h>
31b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaDebug.h>
32b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <dlfcn.h>
33b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
34b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <utils/Errors.h>
35b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
36b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang/* The extractor lifetime is short - just long enough to get
37b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * the media sources constructed - so the shared lib needs to remain open
38b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * beyond the lifetime of the extractor.  So keep the handle as a global
39b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * rather than a member of the extractor
40b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang */
41b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangvoid *gVendorLibHandle = NULL;
42b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
43b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangnamespace android {
44b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
45b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangstatic Mutex gWVMutex;
46b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
47b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::WVMExtractor(const sp<DataSource> &source)
48b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    : mDataSource(source) {
49b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    {
50b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        Mutex::Autolock autoLock(gWVMutex);
51b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        if (gVendorLibHandle == NULL) {
52b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
53b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        }
54b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
55b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        if (gVendorLibHandle == NULL) {
56b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            LOGE("Failed to open libwvm.so");
57b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            return;
58b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        }
59b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    }
60b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
61b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    typedef MediaExtractor *(*GetInstanceFunc)(sp<DataSource>);
62b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    GetInstanceFunc getInstanceFunc =
63b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        (GetInstanceFunc) dlsym(gVendorLibHandle,
64b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang                "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE");
65b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
66b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (getInstanceFunc) {
67b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        LOGD("Calling GetInstanceFunc");
68b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        mImpl = (*getInstanceFunc)(source);
69b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        CHECK(mImpl != NULL);
70b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    } else {
71b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        LOGE("Failed to locate GetInstance in libwvm.so");
72b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    }
73b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
74b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
75b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::~WVMExtractor() {
76b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
77b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
78b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsize_t WVMExtractor::countTracks() {
79b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    return (mImpl != NULL) ? mImpl->countTracks() : 0;
80b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
81b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
82b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MediaSource> WVMExtractor::getTrack(size_t index) {
83b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (mImpl == NULL) {
84b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        return NULL;
85b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    }
86b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    return mImpl->getTrack(index);
87b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
88b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
89b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getTrackMetaData(size_t index, uint32_t flags) {
90b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (mImpl == NULL) {
91b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        return NULL;
92b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    }
93b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    return mImpl->getTrackMetaData(index, flags);
94b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
95b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
96b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getMetaData() {
97b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (mImpl == NULL) {
98b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        return NULL;
99b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    }
100b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    return mImpl->getMetaData();
101b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
102b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
103b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} //namespace android
104b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
105