36d372fb6a
Change the CCHelper class to be an instanced instead of a static pattern. The CCHelper instances all share an interface to the common clock service and register/unregister a callback handler in response to there being CCHelper instance in the system or not. This brings usage of the CCHelper into like with the new auto-disable functionality of the common time service. For any given process, whenever there are CCHelper instances active, the process will maintain a callback target to the common clock service and will be considered to be an active client. Also change all of the users of the CCHelper interface to manage the lifecycle of their new CCHelper instances. Change-Id: I7c28c5d70d9b07ba7407b4ac706e7e7d7253001b
108 lines
3.0 KiB
C++
108 lines
3.0 KiB
C++
/*
|
|
* Copyright (C) 2011 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 __DECODER_PUMP_H__
|
|
#define __DECODER_PUMP_H__
|
|
|
|
#include <pthread.h>
|
|
|
|
#include <common_time/cc_helper.h>
|
|
#include <media/stagefright/MediaSource.h>
|
|
#include <utils/LinearTransform.h>
|
|
#include <utils/List.h>
|
|
#include <utils/threads.h>
|
|
|
|
namespace android {
|
|
|
|
class MetaData;
|
|
class OMXClient;
|
|
class TimedAudioTrack;
|
|
|
|
class AAH_DecoderPump : public MediaSource {
|
|
public:
|
|
explicit AAH_DecoderPump(OMXClient& omx);
|
|
status_t initCheck();
|
|
|
|
status_t queueForDecode(MediaBuffer* buf);
|
|
|
|
status_t init(sp<MetaData> params);
|
|
status_t shutdown();
|
|
|
|
void setRenderTSTransform(const LinearTransform& trans);
|
|
void setRenderVolume(uint8_t volume);
|
|
bool isAboutToUnderflow(int64_t threshold);
|
|
bool getStatus() const { return thread_status_; }
|
|
|
|
// MediaSource methods
|
|
virtual status_t start(MetaData *params) { return OK; }
|
|
virtual sp<MetaData> getFormat() { return format_; }
|
|
virtual status_t stop() { return OK; }
|
|
virtual status_t read(MediaBuffer **buffer,
|
|
const ReadOptions *options);
|
|
|
|
protected:
|
|
virtual ~AAH_DecoderPump();
|
|
|
|
private:
|
|
class ThreadWrapper : public Thread {
|
|
public:
|
|
friend class AAH_DecoderPump;
|
|
explicit ThreadWrapper(AAH_DecoderPump* owner);
|
|
|
|
private:
|
|
virtual bool threadLoop();
|
|
AAH_DecoderPump* owner_;
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(ThreadWrapper);
|
|
};
|
|
|
|
void* workThread();
|
|
virtual status_t shutdown_l();
|
|
void queueToRenderer(MediaBuffer* decoded_sample);
|
|
void stopAndCleanupRenderer();
|
|
|
|
sp<MetaData> format_;
|
|
int32_t format_channels_;
|
|
int32_t format_sample_rate_;
|
|
|
|
sp<MediaSource> decoder_;
|
|
OMXClient& omx_;
|
|
Mutex init_lock_;
|
|
|
|
sp<ThreadWrapper> thread_;
|
|
Condition thread_cond_;
|
|
Mutex thread_lock_;
|
|
status_t thread_status_;
|
|
|
|
Mutex render_lock_;
|
|
TimedAudioTrack* renderer_;
|
|
bool last_queued_pts_valid_;
|
|
int64_t last_queued_pts_;
|
|
bool last_ts_transform_valid_;
|
|
LinearTransform last_ts_transform_;
|
|
uint8_t last_volume_;
|
|
CCHelper cc_helper_;
|
|
|
|
// protected by the thread_lock_
|
|
typedef List<MediaBuffer*> MBQueue;
|
|
MBQueue in_queue_;
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(AAH_DecoderPump);
|
|
};
|
|
|
|
} // namespace android
|
|
#endif // __DECODER_PUMP_H__
|