1efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang/*
2efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Copyright (C) 2011 The Android Open Source Project
3efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *
4efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License");
5efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * you may not use this file except in compliance with the License.
6efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * You may obtain a copy of the License at
7efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *
8efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *      http://www.apache.org/licenses/LICENSE-2.0
9efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang *
10efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * Unless required by applicable law or agreed to in writing, software
11efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS,
12efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * See the License for the specific language governing permissions and
14efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang * limitations under the License.
15efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang */
16efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
17efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <stdint.h>
18efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
19efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <utils/RefBase.h>
20efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <utils/threads.h>
21efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
22efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include <media/stagefright/MediaSource.h>
23efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
24efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "AudioBufferProvider.h"
25efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang#include "AudioResampler.h"
26efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
27efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changnamespace android {
28efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
29efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changstruct MediaBuffer;
30efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
31efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Changclass VideoEditorSRC : public MediaSource , public AudioBufferProvider {
32efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
33efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    public:
34efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        VideoEditorSRC(
35efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            const sp<MediaSource> &source);
36efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
37efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual status_t start (MetaData *params = NULL);
38efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual status_t stop();
39efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual sp<MetaData> getFormat();
40efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual status_t read (
41efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang            MediaBuffer **buffer, const ReadOptions *options = NULL);
42efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
43efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual status_t getNextBuffer(Buffer* buffer);
44efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual void releaseBuffer(Buffer* buffer);
45efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
46efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    enum { //Sampling freq
47efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq8000Hz = 8000,
48efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq11025Hz = 11025,
49efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq12000Hz = 12000,
50efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq16000Hz = 16000,
51efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq22050Hz = 22050,
52efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq240000Hz = 24000,
53efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq32000Hz = 32000,
54efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq44100 = 44100,
55efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        kFreq48000 = 48000,
56efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    };
57efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
58efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    static const uint16_t UNITY_GAIN = 0x1000;
59e79d2faf19cf0eaedf895888e2934262c7ecace7Chih-Chung Chang    static const int32_t DEFAULT_SAMPLING_FREQ = (int32_t)kFreq32000Hz;
60efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
61efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    protected :
62efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        virtual ~VideoEditorSRC();
63efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang    private:
64efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
65efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        VideoEditorSRC();
66efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        VideoEditorSRC &operator=(const VideoEditorSRC &);
67efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
68e79d2faf19cf0eaedf895888e2934262c7ecace7Chih-Chung Chang        void checkAndSetResampler();
6984161acd0c02718b47f82ced3123e9d9eac7b9b9Rajneesh Chowdury
70efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        AudioResampler        *mResampler;
71efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        sp<MediaSource>      mSource;
72efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int mChannelCnt;
73efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int mSampleRate;
74efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int32_t mOutputSampleRate;
75efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        bool mStarted;
76efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        sp<MetaData> mOutputFormat;
77efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
78e79d2faf19cf0eaedf895888e2934262c7ecace7Chih-Chung Chang        MediaBuffer* mBuffer;
79efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int32_t mLeftover;
80e79d2faf19cf0eaedf895888e2934262c7ecace7Chih-Chung Chang        bool mFormatChanged;
810d2c710a293d68fb729eff148d40002f5deacf17Chih-Chung Chang        bool mStopPending;
82efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
83efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int64_t mInitialTimeStampUs;
84efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int64_t mAccuOutBufferSize;
85efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
86efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        int64_t mSeekTimeUs;
87efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang        ReadOptions::SeekMode mSeekMode;
88efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang};
89efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
90efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang} //namespce android
91efa27232d6812a6c71682cc3d0041a39c2bd52efChih-Chung Chang
92