/*
 * Copyright 2012, 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 _ANDROID_MEDIA_MEDIAEXTRACTOR_H_
#define _ANDROID_MEDIA_MEDIAEXTRACTOR_H_

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

#include "jni.h"

namespace android {

struct IMediaHTTPService;
class MetaData;
struct NuMediaExtractor;

struct JMediaExtractor : public RefBase {
    JMediaExtractor(JNIEnv *env, jobject thiz);

    status_t setDataSource(
            const sp<IMediaHTTPService> &httpService,
            const char *path,
            const KeyedVector<String8, String8> *headers);

    status_t setDataSource(int fd, off64_t offset, off64_t size);
    status_t setDataSource(const sp<DataSource> &source);

    status_t setMediaCas(JNIEnv *env, jobject casBinderObj);

    size_t countTracks() const;
    status_t getTrackFormat(size_t index, jobject *format) const;

    status_t getFileFormat(jobject *format) const;

    status_t selectTrack(size_t index);
    status_t unselectTrack(size_t index);

    status_t seekTo(int64_t timeUs, MediaSource::ReadOptions::SeekMode mode);

    status_t advance();
    status_t readSampleData(jobject byteBuf, size_t offset, size_t *sampleSize);
    status_t getSampleTrackIndex(size_t *trackIndex);
    status_t getSampleTime(int64_t *sampleTimeUs);
    status_t getSampleSize(size_t *sampleSize);
    status_t getSampleFlags(uint32_t *sampleFlags);
    status_t getSampleMeta(sp<MetaData> *sampleMeta);
    status_t getMetrics(Parcel *reply) const;

    bool getCachedDuration(int64_t *durationUs, bool *eos) const;
    status_t getAudioPresentations(size_t trackIdx,
            AudioPresentationCollection *presentations) const;

protected:
    virtual ~JMediaExtractor();

private:
    jclass mClass;
    jweak mObject;
    sp<NuMediaExtractor> mImpl;

    DISALLOW_EVIL_CONSTRUCTORS(JMediaExtractor);
};

}  // namespace android

#endif  // _ANDROID_MEDIA_MEDIAEXTRACTOR_H_
