14f1732b8068970b368a89271158ca29daf25650eztenghui/*
24f1732b8068970b368a89271158ca29daf25650eztenghui * Copyright (C) 2013 The Android Open Source Project
34f1732b8068970b368a89271158ca29daf25650eztenghui *
44f1732b8068970b368a89271158ca29daf25650eztenghui * Licensed under the Apache License, Version 2.0 (the "License");
54f1732b8068970b368a89271158ca29daf25650eztenghui * you may not use this file except in compliance with the License.
64f1732b8068970b368a89271158ca29daf25650eztenghui * You may obtain a copy of the License at
74f1732b8068970b368a89271158ca29daf25650eztenghui *
84f1732b8068970b368a89271158ca29daf25650eztenghui *      http://www.apache.org/licenses/LICENSE-2.0
94f1732b8068970b368a89271158ca29daf25650eztenghui *
104f1732b8068970b368a89271158ca29daf25650eztenghui * Unless required by applicable law or agreed to in writing, software
114f1732b8068970b368a89271158ca29daf25650eztenghui * distributed under the License is distributed on an "AS IS" BASIS,
124f1732b8068970b368a89271158ca29daf25650eztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f1732b8068970b368a89271158ca29daf25650eztenghui * See the License for the specific language governing permissions and
144f1732b8068970b368a89271158ca29daf25650eztenghui * limitations under the License.
154f1732b8068970b368a89271158ca29daf25650eztenghui */
164f1732b8068970b368a89271158ca29daf25650eztenghui
174f1732b8068970b368a89271158ca29daf25650eztenghui#ifndef MEDIA_ADAPTER_H
184f1732b8068970b368a89271158ca29daf25650eztenghui#define MEDIA_ADAPTER_H
194f1732b8068970b368a89271158ca29daf25650eztenghui
204f1732b8068970b368a89271158ca29daf25650eztenghui#include <media/stagefright/foundation/ABase.h>
214f1732b8068970b368a89271158ca29daf25650eztenghui#include <media/stagefright/MediaSource.h>
224f1732b8068970b368a89271158ca29daf25650eztenghui#include <media/stagefright/MediaBuffer.h>
234f1732b8068970b368a89271158ca29daf25650eztenghui#include <media/stagefright/MetaData.h>
244f1732b8068970b368a89271158ca29daf25650eztenghui#include <utils/threads.h>
254f1732b8068970b368a89271158ca29daf25650eztenghui
264f1732b8068970b368a89271158ca29daf25650eztenghuinamespace android {
274f1732b8068970b368a89271158ca29daf25650eztenghui
284f1732b8068970b368a89271158ca29daf25650eztenghui// Convert the MediaMuxer's push model into MPEG4Writer's pull model.
294f1732b8068970b368a89271158ca29daf25650eztenghui// Used only by the MediaMuxer for now.
304f1732b8068970b368a89271158ca29daf25650eztenghuistruct MediaAdapter : public MediaSource, public MediaBufferObserver {
314f1732b8068970b368a89271158ca29daf25650eztenghuipublic:
324f1732b8068970b368a89271158ca29daf25650eztenghui    // MetaData is used to set the format and returned at getFormat.
334f1732b8068970b368a89271158ca29daf25650eztenghui    MediaAdapter(const sp<MetaData> &meta);
344f1732b8068970b368a89271158ca29daf25650eztenghui    virtual ~MediaAdapter();
354f1732b8068970b368a89271158ca29daf25650eztenghui    /////////////////////////////////////////////////
364f1732b8068970b368a89271158ca29daf25650eztenghui    // Inherited functions from MediaSource
374f1732b8068970b368a89271158ca29daf25650eztenghui    /////////////////////////////////////////////////
384f1732b8068970b368a89271158ca29daf25650eztenghui
394f1732b8068970b368a89271158ca29daf25650eztenghui    virtual status_t start(MetaData *params = NULL);
404f1732b8068970b368a89271158ca29daf25650eztenghui    virtual status_t stop();
414f1732b8068970b368a89271158ca29daf25650eztenghui    virtual sp<MetaData> getFormat();
424f1732b8068970b368a89271158ca29daf25650eztenghui    virtual status_t read(
434f1732b8068970b368a89271158ca29daf25650eztenghui            MediaBuffer **buffer, const ReadOptions *options = NULL);
444f1732b8068970b368a89271158ca29daf25650eztenghui
454f1732b8068970b368a89271158ca29daf25650eztenghui    /////////////////////////////////////////////////
464f1732b8068970b368a89271158ca29daf25650eztenghui    // Inherited functions from MediaBufferObserver
474f1732b8068970b368a89271158ca29daf25650eztenghui    /////////////////////////////////////////////////
484f1732b8068970b368a89271158ca29daf25650eztenghui
494f1732b8068970b368a89271158ca29daf25650eztenghui    virtual void signalBufferReturned(MediaBuffer *buffer);
504f1732b8068970b368a89271158ca29daf25650eztenghui
514f1732b8068970b368a89271158ca29daf25650eztenghui    /////////////////////////////////////////////////
524f1732b8068970b368a89271158ca29daf25650eztenghui    // Non-inherited functions:
534f1732b8068970b368a89271158ca29daf25650eztenghui    /////////////////////////////////////////////////
544f1732b8068970b368a89271158ca29daf25650eztenghui
554f1732b8068970b368a89271158ca29daf25650eztenghui    // pushBuffer() will wait for the read() finish, and read() will have a
564f1732b8068970b368a89271158ca29daf25650eztenghui    // deep copy, such that after pushBuffer return, the buffer can be re-used.
574f1732b8068970b368a89271158ca29daf25650eztenghui    status_t pushBuffer(MediaBuffer *buffer);
584f1732b8068970b368a89271158ca29daf25650eztenghui
594f1732b8068970b368a89271158ca29daf25650eztenghuiprivate:
604f1732b8068970b368a89271158ca29daf25650eztenghui    Mutex mAdapterLock;
614f1732b8068970b368a89271158ca29daf25650eztenghui    // Make sure the read() wait for the incoming buffer.
624f1732b8068970b368a89271158ca29daf25650eztenghui    Condition mBufferReadCond;
634f1732b8068970b368a89271158ca29daf25650eztenghui    // Make sure the pushBuffer() wait for the current buffer consumed.
644f1732b8068970b368a89271158ca29daf25650eztenghui    Condition mBufferReturnedCond;
654f1732b8068970b368a89271158ca29daf25650eztenghui
664f1732b8068970b368a89271158ca29daf25650eztenghui    MediaBuffer *mCurrentMediaBuffer;
674f1732b8068970b368a89271158ca29daf25650eztenghui
684f1732b8068970b368a89271158ca29daf25650eztenghui    bool mStarted;
694f1732b8068970b368a89271158ca29daf25650eztenghui    sp<MetaData> mOutputFormat;
704f1732b8068970b368a89271158ca29daf25650eztenghui
714f1732b8068970b368a89271158ca29daf25650eztenghui    DISALLOW_EVIL_CONSTRUCTORS(MediaAdapter);
724f1732b8068970b368a89271158ca29daf25650eztenghui};
734f1732b8068970b368a89271158ca29daf25650eztenghui
744f1732b8068970b368a89271158ca29daf25650eztenghui}  // namespace android
754f1732b8068970b368a89271158ca29daf25650eztenghui
764f1732b8068970b368a89271158ca29daf25650eztenghui#endif  // MEDIA_ADAPTER_H
77