summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--Android.mk14
-rw-r--r--screen_source/Android.mk31
-rw-r--r--screen_source/aml_screen.cpp296
-rw-r--r--screen_source/v4l2_vdin.cpp676
-rw-r--r--screen_source/v4l2_vdin.h144
-rw-r--r--tv_callback.h18
-rw-r--r--tv_input.cpp263
-rw-r--r--tvapi/android/Android.mk2
-rw-r--r--tvapi/android/include/ITv.h98
-rw-r--r--tvapi/android/include/ITvClient.h56
-rw-r--r--tvapi/android/include/ITvService.h66
-rw-r--r--tvapi/android/include/Tv.h158
-rw-r--r--tvapi/android/include/tvcmd.h1212
-rw-r--r--tvapi/android/jni/Android.mk135
-rw-r--r--tvapi/android/jni/cfbc_jni.cpp18
-rw-r--r--tvapi/android/jni/cfbc_test.cpp86
-rw-r--r--tvapi/android/jni/com_droidlogic_app_tv_TvControlManager.cpp (renamed from tvapi/android/jni/android_amlogic_tv.cpp)929
-rw-r--r--tvapi/android/libtvbinder/Android.mk48
-rw-r--r--tvapi/android/libtvbinder/ITv.cpp292
-rw-r--r--tvapi/android/libtvbinder/ITvClient.cpp116
-rw-r--r--tvapi/android/libtvbinder/ITvService.cpp100
-rw-r--r--tvapi/android/libtvbinder/Tv.cpp378
-rw-r--r--tvapi/android/tv/Android.mk23
-rw-r--r--tvapi/android/tv/CTv.cpp104
-rw-r--r--tvapi/android/tv/CTv.h54
-rw-r--r--tvapi/android/tvserver/Android.mk164
-rw-r--r--tvapi/android/tvserver/TvService.cpp8911
-rw-r--r--tvapi/android/tvserver/TvService.h170
-rw-r--r--tvapi/android/tvserver/main.cpp46
-rw-r--r--tvapi/android/tvserver/tv_callback.h18
-rw-r--r--[-rwxr-xr-x]tvapi/build/include/.gitignore0
-rw-r--r--tvapi/build/include/xxxconfig.h1
-rw-r--r--tvapi/docs/tv.uml12156
-rw-r--r--tvapi/libtv/Android.mk12
-rw-r--r--tvapi/libtv/audio/CAudioCustomerCtrl.cpp126
-rw-r--r--tvapi/libtv/audio/CAudioCustomerCtrl.h31
-rw-r--r--tvapi/libtv/audio/CTvAudio.cpp30
-rw-r--r--tvapi/libtv/audio/CTvAudio.h76
-rw-r--r--tvapi/libtv/audio/audio_alsa.cpp2073
-rw-r--r--tvapi/libtv/audio/audio_alsa.h257
-rw-r--r--tvapi/libtv/audio/audio_android.cpp1035
-rw-r--r--tvapi/libtv/audio/audio_android.h78
-rw-r--r--tvapi/libtv/audio/audio_android_effect.cpp591
-rw-r--r--tvapi/libtv/audio/audio_android_effect.h65
-rw-r--r--tvapi/libtv/audio/audio_api.cpp2470
-rw-r--r--tvapi/libtv/audio/audio_api.h323
-rw-r--r--tvapi/libtv/audio/audio_effect.cpp356
-rw-r--r--tvapi/libtv/audio/audio_effect.h58
-rw-r--r--tvapi/libtv/include/amstream.h526
-rw-r--r--tvapi/libtv/include/amvecm.h136
-rw-r--r--tvapi/libtv/include/cm.h308
-rw-r--r--tvapi/libtv/include/hdmirx_cec.h316
-rw-r--r--tvapi/libtv/include/ve.h461
-rw-r--r--tvapi/libtv/tv/AutoBackLight.cpp425
-rw-r--r--tvapi/libtv/tv/CAutoPQparam.cpp150
-rw-r--r--tvapi/libtv/tv/CAutoPQparam.h41
-rw-r--r--tvapi/libtv/tv/CAv.cpp116
-rw-r--r--tvapi/libtv/tv/CAv.h24
-rw-r--r--tvapi/libtv/tv/CFbcCommunication.cpp443
-rw-r--r--tvapi/libtv/tv/CFbcCommunication.h25
-rw-r--r--tvapi/libtv/tv/CFrontEnd.cpp198
-rw-r--r--tvapi/libtv/tv/CFrontEnd.h19
-rw-r--r--tvapi/libtv/tv/CTv.cpp13003
-rw-r--r--tvapi/libtv/tv/CTv.h1453
-rw-r--r--tvapi/libtv/tv/CTvBooking.cpp324
-rw-r--r--tvapi/libtv/tv/CTvBooking.h166
-rw-r--r--tvapi/libtv/tv/CTvEpg.cpp24
-rw-r--r--tvapi/libtv/tv/CTvEv.h12
-rw-r--r--tvapi/libtv/tv/CTvLog.h8
-rw-r--r--tvapi/libtv/tv/CTvRecord.cpp552
-rw-r--r--tvapi/libtv/tv/CTvRecord.h92
-rw-r--r--tvapi/libtv/tv/CTvSatellite.h42
-rw-r--r--tvapi/libtv/tv/CTvScanner.cpp335
-rw-r--r--tvapi/libtv/tv/CTvScanner.h26
-rw-r--r--tvapi/libtv/tv/CTvScreenCapture.cpp1279
-rw-r--r--tvapi/libtv/tv/CTvScreenCapture.h351
-rw-r--r--tvapi/libtv/tv/CTvSubtitle.cpp361
-rw-r--r--tvapi/libtv/tv/CTvSubtitle.h484
-rw-r--r--tvapi/libtv/tv/CTvVchipCheck.cpp6
-rw-r--r--tvapi/libtv/tv/CUpgradeFBC.cpp4
-rw-r--r--tvapi/libtv/tv/CUpgradeFBC.h282
-rw-r--r--tvapi/libtv/tv/ScreenCatch.cpp379
-rw-r--r--tvapi/libtv/tvconfig/CIniFile.cpp706
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.conf58
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.cpp106
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.h40
-rw-r--r--tvapi/libtv/tvdb/CTvChannel.cpp694
-rw-r--r--tvapi/libtv/tvdb/CTvChannel.h574
-rw-r--r--tvapi/libtv/tvdb/CTvDatabase.cpp25
-rw-r--r--tvapi/libtv/tvdb/CTvDatabase.h188
-rw-r--r--tvapi/libtv/tvdb/CTvDimension.cpp86
-rw-r--r--tvapi/libtv/tvdb/CTvDimension.h194
-rw-r--r--tvapi/libtv/tvdb/CTvEvent.cpp483
-rw-r--r--tvapi/libtv/tvdb/CTvEvent.h170
-rw-r--r--tvapi/libtv/tvdb/CTvGroup.cpp88
-rw-r--r--tvapi/libtv/tvdb/CTvGroup.h60
-rw-r--r--tvapi/libtv/tvdb/CTvProgram.cpp1806
-rw-r--r--tvapi/libtv/tvdb/CTvProgram.h1066
-rw-r--r--tvapi/libtv/tvdb/CTvRegion.cpp366
-rw-r--r--tvapi/libtv/tvdb/CTvRegion.h84
-rw-r--r--tvapi/libtv/tvin/CHDMIRxCEC.cpp38
-rw-r--r--tvapi/libtv/tvin/CSourceConnectDetect.cpp478
-rw-r--r--tvapi/libtv/tvin/CSourceConnectDetect.h73
-rw-r--r--tvapi/libtv/tvin/CTvin.cpp203
-rw-r--r--tvapi/libtv/tvin/CTvin.h191
-rw-r--r--tvapi/libtv/tvsetting/CBlobDevice.cpp54
-rw-r--r--tvapi/libtv/tvsetting/CBlobDevice.h100
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp403
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceE2prom.h152
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceFile.cpp160
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceFile.h52
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceRam.cpp258
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceRam.h74
-rw-r--r--tvapi/libtv/tvsetting/CTvSetting.cpp4658
-rw-r--r--tvapi/libtv/tvsetting/CTvSetting.h30
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingCfg.h782
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp10
-rw-r--r--tvapi/libtv/tvsetting/TvKeyData.cpp2726
-rw-r--r--tvapi/libtv/tvsetting/TvKeyData.h64
-rw-r--r--tvapi/libtv/tvsetting/audio_cfg.cpp2575
-rw-r--r--tvapi/libtv/tvsetting/audio_cfg.h239
-rw-r--r--tvapi/libtv/tvutils/CCondition.h2
-rw-r--r--tvapi/libtv/tvutils/CFile.cpp65
-rw-r--r--tvapi/libtv/tvutils/CFile.h3
-rw-r--r--tvapi/libtv/tvutils/CHdmiCecCmd.cpp2
-rw-r--r--tvapi/libtv/tvutils/CMsgQueue.cpp31
-rw-r--r--tvapi/libtv/tvutils/CMsgQueue.h3
-rw-r--r--tvapi/libtv/tvutils/CSerialCommunication.h96
-rw-r--r--tvapi/libtv/tvutils/CSerialPort.cpp18
-rw-r--r--tvapi/libtv/tvutils/CSqlite.cpp8
-rw-r--r--tvapi/libtv/tvutils/CSqlite.h12
-rw-r--r--tvapi/libtv/tvutils/CThread.cpp2
-rw-r--r--tvapi/libtv/tvutils/CTvInput.cpp25
-rw-r--r--tvapi/libtv/tvutils/CTvInput.h4
-rw-r--r--tvapi/libtv/tvutils/serial_base.h34
-rw-r--r--tvapi/libtv/tvutils/serial_operate.cpp66
-rw-r--r--tvapi/libtv/tvutils/serial_operate.h70
-rw-r--r--tvapi/libtv/tvutils/tvutils.cpp3931
-rw-r--r--tvapi/libtv/tvutils/tvutils.h222
-rw-r--r--tvapi/libtv/tvutils/zepoll.cpp2
-rw-r--r--tvapi/libtv/version/version.cpp188
-rw-r--r--tvapi/libtv/version/version.h22
-rw-r--r--tvapi/libtv/vpp/CPQdb.cpp3509
-rw-r--r--tvapi/libtv/vpp/CPQdb.h340
-rw-r--r--tvapi/libtv/vpp/CVpp.cpp5602
-rw-r--r--tvapi/libtv/vpp/CVpp.h230
-rw-r--r--tvapi/tvtests/Android.mk98
-rw-r--r--tvapi/tvtests/android_tvtest.cpp2
-rw-r--r--tvapi/tvtests/comm_test.cpp4
-rw-r--r--tvapi/tvtests/ssm_test.cpp420
-rw-r--r--tvapi/tvtests/tvconfig_test.cpp854
151 files changed, 45277 insertions, 47437 deletions
diff --git a/tvapi/libtv/tv/ScreenCatch.cpp b/tvapi/libtv/tv/ScreenCatch.cpp
new file mode 100644
index 0000000..0ed084e
--- a/dev/null
+++ b/tvapi/libtv/tv/ScreenCatch.cpp
@@ -0,0 +1,379 @@
+/*
+ * 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.
+ */
+#define LOG_NDEBUG 1
+#define LOG_TAG "ScreenCatch"
+
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MetaData.h>
+#include <OMX_IVCommon.h>
+#include <MetadataBufferType.h>
+
+#include <ui/GraphicBuffer.h>
+#include <gui/ISurfaceComposer.h>
+#include <gui/IGraphicBufferAlloc.h>
+#include <OMX_Component.h>
+
+#include <utils/Log.h>
+#include <utils/String8.h>
+
+#include <private/gui/ComposerService.h>
+
+#include <media/stagefright/ScreenCatch.h>
+#include <media/stagefright/ScreenSource.h>
+
+#include <binder/IPCThreadState.h>
+#include <binder/MemoryBase.h>
+#include <binder/MemoryHeapBase.h>
+
+#include <stdio.h>
+#include <assert.h>
+#include <limits.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <binder/IServiceManager.h>
+
+#define BOUNDRY 32
+
+#define ALIGN(x) (x + (BOUNDRY) - 1)& ~((BOUNDRY) - 1)
+
+namespace android {
+
+ struct ScreenCatch::ScreenCatchClient : public BnScreenMediaSourceClient {
+ ScreenCatchClient(void *user)
+ {
+ mUser = user;
+ ALOGE("[%s %d] user:%x", __FUNCTION__, __LINE__, user);
+ }
+
+ virtual void notify(int msg, int ext1, int ext2, const Parcel *obj)
+ {
+ ALOGI("notify %d, %d, %d", msg, ext1, ext2);
+ }
+
+ virtual int dataCallback(const sp<IMemory> &data)
+ {
+ return 0;
+ }
+
+ protected:
+ void *mUser;
+ virtual ~ScreenCatchClient() {}
+
+ private:
+ DISALLOW_EVIL_CONSTRUCTORS(ScreenCatchClient);
+ };
+
+ ScreenCatch::ScreenCatch(uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bitSize) :
+ mWidth(ALIGN(bufferWidth)),
+ mHeight(bufferHeight),
+ mScreenMediaSourceService(NULL),
+ mColorFormat(OMX_COLOR_Format32bitARGB8888),
+ mBitSize(bitSize)
+ {
+ ALOGE("ScreenCatch: %dx%d", bufferWidth, bufferHeight);
+
+ if (bufferWidth <= 0 || bufferHeight <= 0 || bufferWidth > 1920 || bufferHeight > 1080) {
+ ALOGE("Invalid dimensions %dx%d", bufferWidth, bufferHeight);
+ }
+
+ if (bitSize != 24 || bitSize != 32)
+ bitSize = 32;
+
+ mCorpX = -1;
+ mCorpY = -1;
+ mCorpWidth = -1;
+ mCorpHeight = -1;
+
+ }
+
+ ScreenCatch::~ScreenCatch()
+ {
+ ALOGE("~ScreenCatch");
+ }
+
+ void ScreenCatch::setVideoRotation(int degree)
+ {
+ int angle;
+
+ ALOGI("[%s %d] setVideoRotation degree:%x", __FUNCTION__, __LINE__, degree);
+
+ }
+
+ void ScreenCatch::setVideoCrop(int x, int y, int width, int height)
+ {
+ mCorpX = x;
+ mCorpY = y;
+ mCorpWidth = width;
+ mCorpHeight = height;
+ }
+
+ static inline void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
+ {
+ register int r, g, b;
+
+ r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
+ g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10;
+ b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
+
+ r = r > 255 ? 255 : r < 0 ? 0 : r;
+ g = g > 255 ? 255 : g < 0 ? 0 : g;
+ b = b > 255 ? 255 : b < 0 ? 0 : b;
+
+ /*ARGB*/
+ *rgb = (unsigned char)r;
+ rgb++;
+ *rgb = (unsigned char)g;
+ rgb++;
+ *rgb = (unsigned char)b;
+ rgb++;
+ *rgb = 0xff;
+
+ }
+
+ void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height)
+ {
+ int x, y, z = 0;
+ int h, w;
+ int blocks;
+ unsigned char Y1, Y2, U, V;
+
+ blocks = (width * height) * 2;
+
+ for (h = 0, z = 0; h < height; h += 2) {
+ for (y = 0; y < width * 2; y += 2) {
+
+ Y1 = buf[ h * width + y + 0];
+ V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ];
+ Y2 = buf[ h * width + y + 1];
+ U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ];
+
+ yuv_to_rgb32(Y1, U, V, &rgb[z]);
+ yuv_to_rgb32(Y2, U, V, &rgb[z + 4]);
+ z += 8;
+ }
+ }
+ }
+
+ static inline void yuv_to_rgb24(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
+ {
+ register int r, g, b;
+
+ r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
+ g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10;
+ b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
+
+ r = r > 255 ? 255 : r < 0 ? 0 : r;
+ g = g > 255 ? 255 : g < 0 ? 0 : g;
+ b = b > 255 ? 255 : b < 0 ? 0 : b;
+
+ /*ARGB*/
+ *rgb = (unsigned char)r;
+ rgb++;
+ *rgb = (unsigned char)g;
+ rgb++;
+ *rgb = (unsigned char)b;
+ }
+
+ void nv21_to_rgb24(unsigned char *buf, unsigned char *rgb, int width, int height)
+ {
+ int x, y, z = 0;
+ int h, w;
+ int blocks;
+ unsigned char Y1, Y2, U, V;
+
+ blocks = (width * height) * 2;
+
+ for (h = 0, z = 0; h < height; h += 2) {
+ for (y = 0; y < width * 2; y += 2) {
+
+ Y1 = buf[ h * width + y + 0];
+ V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ];
+ Y2 = buf[ h * width + y + 1];
+ U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ];
+
+ yuv_to_rgb24(Y1, U, V, &rgb[z]);
+ yuv_to_rgb24(Y2, U, V, &rgb[z + 3]);
+ z += 6;
+ }
+ }
+ }
+
+ int ScreenCatch::threadFunc()
+ {
+ int64_t pts;
+ int status;
+
+ sp<MemoryHeapBase> newMemoryHeap = new MemoryHeapBase(mWidth * mHeight * 3 / 2);
+ sp<MemoryBase> buffer = new MemoryBase(newMemoryHeap, 0, mWidth * mHeight * 3 / 2);
+
+ ALOGV("[%s %d] empty:%d", __FUNCTION__, __LINE__, mRawBufferQueue.empty());
+
+ while (mStart == true) {
+
+ status = mScreenMediaSourceService->readBuffer(mClientId, buffer, &pts);
+
+ if (status != OK && mStart == true) {
+ usleep(10000);
+ continue;
+ }
+
+ if (mStart != true)
+ break;
+
+ MediaBuffer *accessUnit;
+
+ if (OMX_COLOR_Format24bitRGB888 == mColorFormat) { //rgb 24bit
+ accessUnit = new MediaBuffer(mWidth * mHeight * 3);
+ nv21_to_rgb24((unsigned char *)buffer->pointer(), (unsigned char *)accessUnit->data(), mWidth, mHeight);
+ accessUnit->set_range(0, mWidth * mHeight * 3);
+ } else if (OMX_COLOR_Format32bitARGB8888 == mColorFormat) { //rgba 32bit
+ accessUnit = new MediaBuffer(mWidth * mHeight * 4);
+ nv21_to_rgb32((unsigned char *)buffer->pointer(), (unsigned char *)accessUnit->data(), mWidth, mHeight);
+ accessUnit->set_range(0, mWidth * mHeight * 4);
+ } else if (OMX_COLOR_FormatYUV420SemiPlanar == mColorFormat) { //nv21
+ accessUnit = new MediaBuffer(mWidth * mHeight * 3 / 2);
+ memcpy((unsigned char *)accessUnit->data(), (unsigned char *)buffer->pointer(), mWidth * mHeight * 3 / 2);
+ accessUnit->set_range(0, mWidth * mHeight * 3 / 2);
+ }
+ mRawBufferQueue.push_back(accessUnit);
+ }
+
+ ALOGE("[%s %d] thread out", __FUNCTION__, __LINE__);
+
+ mThreadOutCondition.signal();
+
+ return 0;
+ }
+
+ void *ScreenCatch::ThreadWrapper(void *me)
+ {
+
+ ScreenCatch *Convertor = static_cast<ScreenCatch *>(me);
+ Convertor->threadFunc();
+ return NULL;
+ }
+
+ status_t ScreenCatch::start(MetaData *params)
+ {
+ ALOGE("[%s %d] mWidth:%d mHeight:%d", __FUNCTION__, __LINE__, mWidth, mHeight);
+ Mutex::Autolock autoLock(mLock);
+
+ status_t status;
+ int64_t pts;
+ int client_id;
+
+ sp<IServiceManager> sm = defaultServiceManager();
+ sp<IBinder> binder = sm->getService(String16("media.screenmediasource"));
+ mScreenMediaSourceService = interface_cast<IScreenMediaSource>(binder);
+
+ sp<ScreenCatchClient> mIScreenSourceClient = new ScreenCatchClient(this);
+
+ ALOGE("[%s %d] mWidth:%d mHeight:%d", __FUNCTION__, __LINE__, mWidth, mHeight);
+
+ mScreenMediaSourceService->registerClient(mIScreenSourceClient, mWidth, mHeight, 1, SCREENMEDIASOURC_RAWDATA_TYPE, &client_id, NULL);
+
+ ALOGE("[%s %d] client_id:%d", __FUNCTION__, __LINE__, client_id);
+
+ mClientId = client_id;
+
+ if (status != OK) {
+ ALOGE("setResolutionRatio fail");
+ return !OK;
+ }
+
+ ALOGV("[%s %d] mCorpX:%d mCorpY:%d mCorpWidth:%d mCorpHeight:%d", __FUNCTION__, __LINE__, mCorpX, mCorpY, mCorpWidth, mCorpHeight);
+
+ if (mCorpX != -1)
+ mScreenMediaSourceService->setVideoCrop(client_id, mCorpX, mCorpY, mCorpWidth, mCorpHeight);
+
+
+ status = mScreenMediaSourceService->start(client_id);
+
+ if (status != OK) {
+ mScreenMediaSourceService->unregisterClient(mClientId);
+ ALOGE("ScreenMediaSourceService start fail");
+ return !OK;
+ }
+
+ if (!(params->findInt32(kKeyColorFormat, &mColorFormat)
+ && (mColorFormat != OMX_COLOR_FormatYUV420SemiPlanar
+ || mColorFormat != OMX_COLOR_Format24bitRGB888
+ || mColorFormat != OMX_COLOR_Format32bitARGB8888)))
+ mColorFormat = OMX_COLOR_Format32bitARGB8888;
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ pthread_create(&mThread, &attr, ThreadWrapper, this);
+ pthread_attr_destroy(&attr);
+
+ mStart = true;
+
+ ALOGV("[%s %d]", __FUNCTION__, __LINE__);
+ return OK;
+ }
+
+ status_t ScreenCatch::stop()
+ {
+ ALOGV("[%s %d]", __FUNCTION__, __LINE__);
+ Mutex::Autolock autoLock(mLock);
+ mStart = false;
+
+ mThreadOutCondition.waitRelative(mLock, 1000000000000);
+ ALOGV("[%s %d]", __FUNCTION__, __LINE__);
+
+ while (!mRawBufferQueue.empty()) {
+
+ ALOGV("[%s %d] free buffer", __FUNCTION__, __LINE__);
+
+ MediaBuffer *rawBuffer = *mRawBufferQueue.begin();
+ mRawBufferQueue.erase(mRawBufferQueue.begin());
+ rawBuffer->release();
+ }
+
+ mScreenMediaSourceService->stop(mClientId);
+ mScreenMediaSourceService->unregisterClient(mClientId);
+
+ return OK;
+ }
+
+ status_t ScreenCatch::read(MediaBuffer **buffer)
+ {
+ Mutex::Autolock autoLock(mLock);
+
+ if (!mRawBufferQueue.empty()) {
+ MediaBuffer *rawBuffer = *mRawBufferQueue.begin();
+ mRawBufferQueue.erase(mRawBufferQueue.begin());
+ *buffer = rawBuffer;
+ return OK;
+ }
+
+ return !OK;
+ }
+
+ status_t ScreenCatch::free(MediaBuffer *buffer)
+ {
+ Mutex::Autolock autoLock(mLock);
+ buffer->release();
+ return OK;
+ }
+
+} // end of namespace android