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