19969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang/*
29969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
39969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
49969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
59969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * you may not use this file except in compliance with the License.
69969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * You may obtain a copy of the License at
79969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
89969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
99969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang *
109969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software
119969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
129969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * See the License for the specific language governing permissions and
149969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang * limitations under the License.
159969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang */
169969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
179969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
1800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong#include <stdint.h>
199969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include <media/stagefright/MediaSource.h>
202dd4bdd715f586d4d30cf90cc6fc2bbfbce60fe0Glenn Kasten#include <media/AudioBufferProvider.h>
219969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang#include "AudioResampler.h"
229969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
239969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changnamespace android {
249969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
259969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changstruct MediaBuffer;
269969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
279969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Changclass VideoEditorSRC : public MediaSource , public AudioBufferProvider {
289969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
2900f742c087d92e5452d29be1fb668022b5f8a6c7James Dongpublic:
3000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    VideoEditorSRC(const sp<MediaSource> &source);
319969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
3200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    virtual status_t start (MetaData *params = NULL);
3300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    virtual status_t stop();
3400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    virtual sp<MetaData> getFormat();
3500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    virtual status_t read (
3600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong                MediaBuffer **buffer, const ReadOptions *options = NULL);
379969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
387719f633bd8747b2f56c7be0f102ff131c074c2eJohn Grossman    virtual status_t getNextBuffer(Buffer* buffer, int64_t pts);
3900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    virtual void releaseBuffer(Buffer* buffer);
409969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
4100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    // Sampling freqencies
4200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    enum {
4300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        kFreq8000Hz  = 8000,
449969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        kFreq11025Hz = 11025,
459969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        kFreq12000Hz = 12000,
469969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        kFreq16000Hz = 16000,
479969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        kFreq22050Hz = 22050,
487a4097cc526fc25a36e0f451613340a9444ca043James Dong        kFreq24000Hz = 24000,
499969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang        kFreq32000Hz = 32000,
5000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        kFreq44100Hz = 44100,
5100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong        kFreq48000Hz = 48000,
529969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang    };
539969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5400f742c087d92e5452d29be1fb668022b5f8a6c7James Dongprotected :
5500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    virtual ~VideoEditorSRC();
569969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
5700f742c087d92e5452d29be1fb668022b5f8a6c7James Dongprivate:
5800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    AudioResampler *mResampler;
5900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    sp<MediaSource> mSource;
6000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int mChannelCnt;
6100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int mSampleRate;
6200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int32_t mOutputSampleRate;
6300f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    bool mStarted;
6400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    sp<MetaData> mOutputFormat;
659969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
6600f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    MediaBuffer* mBuffer;
6700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int32_t mLeftover;
6800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    bool mFormatChanged;
6900f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    bool mStopPending;
709969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int64_t mInitialTimeStampUs;
7200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int64_t mAccuOutBufferSize;
731c3c54395729dfae20357d4e510038084cc416ccRajneesh Chowdury
7400f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    int64_t mSeekTimeUs;
7500f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    ReadOptions::SeekMode mSeekMode;
769969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
7700f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    VideoEditorSRC();
7800f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    void checkAndSetResampler();
799969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
8000f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    // Don't call me
8100f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    VideoEditorSRC(const VideoEditorSRC&);
8200f742c087d92e5452d29be1fb668022b5f8a6c7James Dong    VideoEditorSRC &operator=(const VideoEditorSRC &);
839969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
849969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang};
859969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
869969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang} //namespce android
879969866cfe5b17c6e481b90d81b011a0cece78a0Chih-Chung Chang
88