Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 918c7652 authored by Andreas Huber's avatar Andreas Huber
Browse files

Change NuMediaExtractor's API to support different kinds of data sources.

Change-Id: I080aa2ce28300a72a85751509334dbdc491936c6
related-to-bug: 6276111
parent 1803c3ae
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@

#include <media/stagefright/foundation/ABase.h>
#include <utils/Errors.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <utils/Vector.h>

namespace android {
@@ -38,7 +40,11 @@ struct NuMediaExtractor : public RefBase {

    NuMediaExtractor();

    status_t setDataSource(const char *path);
    status_t setDataSource(
            const char *path,
            const KeyedVector<String8, String8> *headers = NULL);

    status_t setDataSource(int fd, off64_t offset, off64_t size);

    size_t countTracks() const;
    status_t getTrackFormat(size_t index, sp<AMessage> *format) const;
+13 −1
Original line number Diff line number Diff line
@@ -142,7 +142,19 @@ sp<DataSource> DataSource::CreateFromURI(
        if (httpSource->connect(uri, headers) != OK) {
            return NULL;
        }
        source = new NuCachedSource2(httpSource);

        String8 cacheConfig;
        bool disconnectAtHighwatermark;
        if (headers != NULL) {
            KeyedVector<String8, String8> copy = *headers;
            NuCachedSource2::RemoveCacheSpecificHeaders(
                    &copy, &cacheConfig, &disconnectAtHighwatermark);
        }

        source = new NuCachedSource2(
                httpSource,
                cacheConfig.isEmpty() ? NULL : cacheConfig.string());

# if CHROMIUM_AVAILABLE
    } else if (!strncasecmp("data:", uri, 5)) {
        source = new DataUriSource(uri);
+34 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/DataSource.h>
#include <media/stagefright/FileSource.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
@@ -51,8 +52,13 @@ NuMediaExtractor::~NuMediaExtractor() {
    mSelectedTracks.clear();
}

status_t NuMediaExtractor::setDataSource(const char *path) {
    sp<DataSource> dataSource = DataSource::CreateFromURI(path);
status_t NuMediaExtractor::setDataSource(
        const char *path, const KeyedVector<String8, String8> *headers) {
    if (mImpl != NULL) {
        return -EINVAL;
    }

    sp<DataSource> dataSource = DataSource::CreateFromURI(path, headers);

    if (dataSource == NULL) {
        return -ENOENT;
@@ -67,6 +73,27 @@ status_t NuMediaExtractor::setDataSource(const char *path) {
    return OK;
}

status_t NuMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) {
    if (mImpl != NULL) {
        return -EINVAL;
    }

    sp<FileSource> fileSource = new FileSource(dup(fd), offset, size);

    status_t err = fileSource->initCheck();
    if (err != OK) {
        return err;
    }

    mImpl = MediaExtractor::Create(fileSource);

    if (mImpl == NULL) {
        return ERROR_UNSUPPORTED;
    }

    return OK;
}

size_t NuMediaExtractor::countTracks() const {
    return mImpl == NULL ? 0 : mImpl->countTracks();
}
@@ -91,6 +118,11 @@ status_t NuMediaExtractor::getTrackFormat(
    sp<AMessage> msg = new AMessage;
    msg->setString("mime", mime);

    int64_t durationUs;
    if (meta->findInt64(kKeyDuration, &durationUs)) {
        msg->setInt64("durationUs", durationUs);
    }

    if (!strncasecmp("video/", mime, 6)) {
        int32_t width, height;
        CHECK(meta->findInt32(kKeyWidth, &width));