1388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber/*
2388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * Copyright (C) 2010 The Android Open Source Project
3388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber *
4388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * you may not use this file except in compliance with the License.
6388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * You may obtain a copy of the License at
7388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber *
8388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber *
10388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * See the License for the specific language governing permissions and
14388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber * limitations under the License.
15388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber */
16388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
17388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber#ifndef VORBIS_DECODER_H_
18388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
19388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber#define VORBIS_DECODER_H_
20388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
21388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber#include <media/stagefright/MediaSource.h>
22388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
23388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huberstruct vorbis_dsp_state;
24388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huberstruct vorbis_info;
25388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
26388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Hubernamespace android {
27388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
28388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huberstruct MediaBufferGroup;
29388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
30388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huberstruct VorbisDecoder : public MediaSource {
31388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    VorbisDecoder(const sp<MediaSource> &source);
32388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
33388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    virtual status_t start(MetaData *params);
34388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    virtual status_t stop();
35388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
36388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    virtual sp<MetaData> getFormat();
37388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
38388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    virtual status_t read(
39388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber            MediaBuffer **buffer, const ReadOptions *options);
40388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
41388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huberprotected:
42388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    virtual ~VorbisDecoder();
43388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
44388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huberprivate:
45388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    enum {
46388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber        kMaxNumSamplesPerBuffer = 8192 * 2
47388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    };
48388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
49388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    sp<MediaSource> mSource;
50388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    bool mStarted;
51388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
52388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    MediaBufferGroup *mBufferGroup;
53388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
54388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    int32_t mNumChannels;
55388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    int32_t mSampleRate;
56388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    int64_t mAnchorTimeUs;
57388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    int64_t mNumFramesOutput;
5838ae220bb7c06e3cc82f96dada769c6b12a79d09Andreas Huber    int32_t mNumFramesLeftOnPage;
59388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
60388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    vorbis_dsp_state *mState;
61388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    vorbis_info *mVi;
62388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
63388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    int decodePacket(MediaBuffer *packet, MediaBuffer *out);
64388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
65388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    VorbisDecoder(const VorbisDecoder &);
66388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber    VorbisDecoder &operator=(const VorbisDecoder &);
67388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber};
68388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
69388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber}  // namespace android
70388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
71388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber#endif  // VORBIS_DECODER_H_
72388379f8b4cabe7bccf280d450a6db2c3149796bAndreas Huber
73