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

Commit 4d61f602 authored by Andreas Huber's avatar Andreas Huber
Browse files

Switch stagefright's approach to prefetching to the new model. The java...

Switch stagefright's approach to prefetching to the new model. The java MediaPlayer is now notified about rebuffering start/end via info messages.

Change-Id: If8185ba329ce8b6663b1ad39a4efb0ad3be81df2
parent a6ef19a8
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -88756,6 +88756,28 @@
 visibility="public"
>
</field>
<field name="MEDIA_INFO_BUFFERING_END"
 type="int"
 transient="false"
 volatile="false"
 value="702"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="MEDIA_INFO_BUFFERING_START"
 type="int"
 transient="false"
 volatile="false"
 value="701"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="MEDIA_INFO_METADATA_UPDATE"
 type="int"
 transient="false"
+5 −0
Original line number Diff line number Diff line
@@ -93,6 +93,11 @@ enum media_info_type {
    // The video is too complex for the decoder: it can't decode frames fast
    // enough. Possibly only the audio plays fine at this stage.
    MEDIA_INFO_VIDEO_TRACK_LAGGING = 700,
    // MediaPlayer is temporarily pausing playback internally in order to
    // buffer more data.
    MEDIA_INFO_BUFFERING_START = 701,
    // MediaPlayer is resuming playback after filling buffers.
    MEDIA_INFO_BUFFERING_END = 702,
    // 8xx
    // Bad interleaving means that a media has been improperly interleaved or not
    // interleaved at all, e.g has all the video samples first then all the audio
+0 −66
Original line number Diff line number Diff line
/*
 * 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.
 */

#ifndef CACHING_DATASOURCE_H_

#define CACHING_DATASOURCE_H_

#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaErrors.h>
#include <utils/threads.h>

namespace android {

class CachingDataSource : public DataSource {
public:
    CachingDataSource(
            const sp<DataSource> &source, size_t pageSize, int numPages);

    virtual status_t initCheck() const;

    virtual ssize_t readAt(off_t offset, void *data, size_t size);

    virtual status_t getSize(off_t *size);

    virtual uint32_t flags();

protected:
    virtual ~CachingDataSource();

private:
    struct Page {
        Page *mPrev, *mNext;
        off_t mOffset;
        size_t mLength;
        void *mData;
    };

    sp<DataSource> mSource;
    void *mData;
    size_t mPageSize;
    Page *mFirst, *mLast;

    Page *allocate_page();

    Mutex mLock;

    CachingDataSource(const CachingDataSource &);
    CachingDataSource &operator=(const CachingDataSource &);
};

}  // namespace android

#endif  // CACHING_DATASOURCE_H_
+0 −103
Original line number Diff line number Diff line
/*
 * 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.
 */

#ifndef HTTP_DATASOURCE_H_

#define HTTP_DATASOURCE_H_

#include <media/stagefright/DataSource.h>
#include <utils/String8.h>
#include <utils/threads.h>

namespace android {

class HTTPStream;

class HTTPDataSource : public DataSource {
public:
    HTTPDataSource(
            const char *host, int port, const char *path,
            const KeyedVector<String8, String8> *headers = NULL);

    HTTPDataSource(
            const char *uri,
            const KeyedVector<String8, String8> *headers = NULL);

    status_t connect();
    void disconnect();

    virtual status_t initCheck() const;

    virtual ssize_t readAt(off_t offset, void *data, size_t size);

    virtual status_t getSize(off_t *size);

    virtual uint32_t flags();

protected:
    virtual ~HTTPDataSource();

private:
    enum {
        kBufferSize = 64 * 1024,

        // If we encounter a socket-read error we'll try reconnecting
        // and restarting the read for at most this many times.
        kMaxNumRetries = 3,
    };

    enum State {
        DISCONNECTED,
        CONNECTING,
        CONNECTED
    };

    State mState;
    mutable Mutex mStateLock;

    String8 mHeaders;

    String8 mStartingHost;
    String8 mStartingPath;
    int mStartingPort;

    HTTPStream *mHttp;

    void *mBuffer;
    size_t mBufferLength;
    off_t mBufferOffset;

    bool mContentLengthValid;
    unsigned long long mContentLength;

    int32_t mNumRetriesLeft;

    void init(const KeyedVector<String8, String8> *headers);

    ssize_t sendRangeRequest(size_t offset);
    void initHeaders(const KeyedVector<String8, String8> *overrides);

    status_t connectWithRedirectsAndRange(off_t rangeStart);
    void applyTimeoutResponse();

    HTTPDataSource(const HTTPDataSource &);
    HTTPDataSource &operator=(const HTTPDataSource &);
};

}  // namespace android

#endif  // HTTP_DATASOURCE_H_
+9 −0
Original line number Diff line number Diff line
@@ -1523,6 +1523,15 @@ public class MediaPlayer
     */
    public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;

    /** MediaPlayer is temporarily pausing playback internally in order to
     * buffer more data.
     */
    public static final int MEDIA_INFO_BUFFERING_START = 701;

    /** MediaPlayer is resuming playback after filling buffers.
     */
    public static final int MEDIA_INFO_BUFFERING_END = 702;

    /** Bad interleaving means that a media has been improperly interleaved or
     * not interleaved at all, e.g has all the video samples first then all the
     * audio ones. Video is playing but a lot of disk seeks may be happening.
Loading