/media/libstagefright/MediaExtractor.cpp
https://github.com/antslava/platform_frameworks_base · C++ · 100 lines · 67 code · 16 blank · 17 comment · 23 complexity · 1d36389ae2ca4c60a17f3214876169fc MD5 · raw file
- /*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- //#define LOG_NDEBUG 0
- #define LOG_TAG "MediaExtractor"
- #include <utils/Log.h>
- #include "include/AMRExtractor.h"
- #include "include/MP3Extractor.h"
- #include "include/MPEG4Extractor.h"
- #include "include/WAVExtractor.h"
- #include "include/OggExtractor.h"
- #include "include/MPEG2TSExtractor.h"
- #include "include/DRMExtractor.h"
- #include "matroska/MatroskaExtractor.h"
- #include <media/stagefright/foundation/AMessage.h>
- #include <media/stagefright/DataSource.h>
- #include <media/stagefright/MediaDefs.h>
- #include <media/stagefright/MediaExtractor.h>
- #include <media/stagefright/MetaData.h>
- #include <utils/String8.h>
- namespace android {
- sp<MetaData> MediaExtractor::getMetaData() {
- return new MetaData;
- }
- uint32_t MediaExtractor::flags() const {
- return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK;
- }
- // static
- sp<MediaExtractor> MediaExtractor::Create(
- const sp<DataSource> &source, const char *mime) {
- sp<AMessage> meta;
- String8 tmp;
- if (mime == NULL) {
- float confidence;
- if (!source->sniff(&tmp, &confidence, &meta)) {
- LOGV("FAILED to autodetect media content.");
- return NULL;
- }
- mime = tmp.string();
- LOGV("Autodetected media content as '%s' with confidence %.2f",
- mime, confidence);
- }
- if (!strncmp(mime, "drm", 3)) {
- const char *originalMime = strrchr(mime, '+') + 1;
- if (!strncmp(mime, "drm+es_based", 12)) {
- return new DRMExtractor(source, originalMime);
- } else if (!strncmp(mime, "drm+container_based", 19)) {
- mime = originalMime;
- } else {
- return NULL;
- }
- }
- if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)
- || !strcasecmp(mime, "audio/mp4")) {
- return new MPEG4Extractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
- return new MP3Extractor(source, meta);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)
- || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
- return new AMRExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)) {
- return new WAVExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG)) {
- return new OggExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)) {
- return new MatroskaExtractor(source);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) {
- return new MPEG2TSExtractor(source);
- }
- return NULL;
- }
- } // namespace android