MediaExtractor.cpp revision 8ddeebb93cb41e7a8e9fe763afb6c6016b21fa61
1/* 2 * Copyright (C) 2009 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 "MediaExtractor" 19#include <utils/Log.h> 20 21#include "include/AMRExtractor.h" 22#include "include/MP3Extractor.h" 23#include "include/MPEG4Extractor.h" 24#include "include/WAVExtractor.h" 25#include "include/OggExtractor.h" 26#include "include/MPEG2TSExtractor.h" 27#include "include/DRMExtractor.h" 28#include "include/WVMExtractor.h" 29#include "include/FLACExtractor.h" 30#include "include/AACExtractor.h" 31 32#include "matroska/MatroskaExtractor.h" 33 34#include <media/stagefright/foundation/AMessage.h> 35#include <media/stagefright/DataSource.h> 36#include <media/stagefright/MediaDefs.h> 37#include <media/stagefright/MediaExtractor.h> 38#include <media/stagefright/MetaData.h> 39#include <utils/String8.h> 40 41namespace android { 42 43sp<MetaData> MediaExtractor::getMetaData() { 44 return new MetaData; 45} 46 47uint32_t MediaExtractor::flags() const { 48 return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK; 49} 50 51// static 52sp<MediaExtractor> MediaExtractor::Create( 53 const sp<DataSource> &source, const char *mime) { 54 sp<AMessage> meta; 55 56 String8 tmp; 57 if (mime == NULL) { 58 float confidence; 59 if (!source->sniff(&tmp, &confidence, &meta)) { 60 LOGV("FAILED to autodetect media content."); 61 62 return NULL; 63 } 64 65 mime = tmp.string(); 66 LOGV("Autodetected media content as '%s' with confidence %.2f", 67 mime, confidence); 68 } 69 70 bool isDrm = false; 71 // DRM MIME type syntax is "drm+type+original" where 72 // type is "es_based" or "container_based" and 73 // original is the content's cleartext MIME type 74 if (!strncmp(mime, "drm+", 4)) { 75 const char *originalMime = strchr(mime+4, '+'); 76 if (originalMime == NULL) { 77 // second + not found 78 return NULL; 79 } 80 ++originalMime; 81 if (!strncmp(mime, "drm+es_based+", 13)) { 82 // DRMExtractor sets container metadata kKeyIsDRM to 1 83 return new DRMExtractor(source, originalMime); 84 } else if (!strncmp(mime, "drm+container_based+", 20)) { 85 mime = originalMime; 86 isDrm = true; 87 } else { 88 return NULL; 89 } 90 } 91 92 MediaExtractor *ret = NULL; 93 if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4) 94 || !strcasecmp(mime, "audio/mp4")) { 95 ret = new MPEG4Extractor(source); 96 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 97 ret = new MP3Extractor(source, meta); 98 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB) 99 || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 100 ret = new AMRExtractor(source); 101 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 102 ret = new FLACExtractor(source); 103 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)) { 104 ret = new WAVExtractor(source); 105 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG)) { 106 ret = new OggExtractor(source); 107 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)) { 108 ret = new MatroskaExtractor(source); 109 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) { 110 ret = new MPEG2TSExtractor(source); 111 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WVM)) { 112 ret = new WVMExtractor(source); 113 } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC_ADTS)) { 114 ret = new AACExtractor(source); 115 } 116 if (ret != NULL && isDrm) { 117 ret->getMetaData()->setInt32(kKeyIsDRM, 1); 118 } 119 120 return ret; 121} 122 123} // namespace android 124