MediaExtractor.cpp revision 70f521de2675ce6eedf4b22beed94ea1289b0f38
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "MediaExtractor" 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2166326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include "include/AMRExtractor.h" 2266326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include "include/MP3Extractor.h" 2366326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber#include "include/MPEG4Extractor.h" 240dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber#include "include/WAVExtractor.h" 25ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber#include "include/OggExtractor.h" 26cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber#include "include/MPEG2TSExtractor.h" 2766326a5ee0869f1ee4d136a477e6effba428b3cbAndreas Huber 28093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber#include "matroska/MatroskaExtractor.h" 29093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber 305a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber#include <media/stagefright/foundation/AMessage.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/DataSource.h> 3218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h> 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaExtractor.h> 34fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#include <media/stagefright/MetaData.h> 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h> 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 39fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Hubersp<MetaData> MediaExtractor::getMetaData() { 40fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber return new MetaData; 41fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber} 42fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 43acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t MediaExtractor::flags() const { 4470f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK; 45acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 46acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 48693d271e62a3726689ff68f4505ba49228eb94b2Andreas Hubersp<MediaExtractor> MediaExtractor::Create( 49693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber const sp<DataSource> &source, const char *mime) { 505a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber sp<AMessage> meta; 515a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber String8 tmp; 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mime == NULL) { 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber float confidence; 555a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber if (!source->sniff(&tmp, &confidence, &meta)) { 56fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber LOGV("FAILED to autodetect media content."); 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NULL; 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mime = tmp.string(); 6247bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber LOGV("Autodetected media content as '%s' with confidence %.2f", 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mime, confidence); 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6618291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4) 6718291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber || !strcasecmp(mime, "audio/mp4")) { 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return new MPEG4Extractor(source); 6918291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 705a1c3529e4fa2f8a11054181294e0ce79fff8dd3Andreas Huber return new MP3Extractor(source, meta); 7118291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB) 7218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 73f75978f63a25e79c683e96611f95cb5cd49efd3dAndreas Huber return new AMRExtractor(source); 740dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)) { 750dba73763a04d39faf999dcc5ef12af3c99535a7Andreas Huber return new WAVExtractor(source); 76ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG)) { 77ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber return new OggExtractor(source); 78093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)) { 79093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber return new MatroskaExtractor(source); 80cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) { 81cda17c606b0fe3ccda4dc68a6d43882410ea2462Andreas Huber return new MPEG2TSExtractor(source); 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NULL; 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 88