/*************************************** . mk ****************************************************/
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES:= \
ILiveSearchService.cpp \
LiveSearchService.cpp \
CommonConvertor.cpp \
ISystemControlService.cpp \
SystemControlService.cpp \
ILivePlayService.cpp \
LivePlayService.cpp \
IEPGService.cpp \
EPGService.cpp \
ISystemInfoService.cpp \
SystemInfoService.cpp \
IDvbUpdateService.cpp \
DvbUpdateService.cpp \
ILiveBouquetService.cpp \
LiveBouquetService.cpp \
LiveDrawService.cpp \
LOCAL_SHARED_LIBRARIES := \
libui libcutils libutils libbinder libsonivox libicuuc libexpat \
libdl \
libandroid_runtime \
libsurfaceflinger_client \
libskia
LOCAL_SHARED_LIBRARIES += libstlport \
LOCAL_SHARED_LIBRARIES += libdm \
LOCAL_MODULE:= libnativedm
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE) \
ccdt/frameworks/base/dvb/libdm \
$(TOP)/external/stlport/stlport \
$(TOP)/external/skia/include/core \
$(TOP)/external/skia/include/utils \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/EpgReceiver \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/ProgramSearch \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/ServiceFactory \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/SystemControl \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/ProgramPlay \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/SystemInfo \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/BouquetMonitor \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/IService/OtaLoader \
ccdt/frameworks/base/dvb/libdm/src/DVB/DDManager \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/Notification \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/TableFilter \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/SectionFilter \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/FrontMonitor \
ccdt/frameworks/base/dvb/libdm/src/DVB/DvbCore/Component/TableSystem \
ccdt/frameworks/base/dvb/libdm/src/include \
ccdt/frameworks/base/dvb/libdm//src/DVB/DvbCore/include \
ccdt/frameworks/base/dvb/libdm/src/DD/include \
ccdt/frameworks/base/dvb/libdm/src/DVB/Utils \
include $(BUILD_SHARED_LIBRARY)
/******************************************* .h ************************************************************/
#ifndef LIVEDRAWSERVICE_H
#define LIVEDRAWSERVICE_H
#include <utils/threads.h>
#include <utils/String16.h>
#include <surfaceflinger/SurfaceComposerClient.h>
#include <surfaceflinger/Surface.h>
#include <surfaceflinger/ISurfaceComposer.h>
#include <SkCanvas.h>
#include <SkRegion.h>
#include <SkBitmap.h>
namespace android {
enum ePixelFormat {
PixelFormat_32BitRGBA = PIXEL_FORMAT_RGBA_8888 , // 4x8-bit RGBA
PixelFormat_32BitRGB0 = PIXEL_FORMAT_RGBX_8888 , // 4x8-bit RGB0
PixelFormat_24BitRGB = PIXEL_FORMAT_RGB_888 , // 3x8-bit RGB
PixelFormat_16BitRGB = PIXEL_FORMAT_RGB_565 , // 16-bit RGB
PixelFormat_32BitBGRA = PIXEL_FORMAT_BGRA_8888 , // 4x8-bit BGRA
PixelFormat_16BitARGB5551 = PIXEL_FORMAT_RGBA_5551 , // 16-bit ARGB
PixelFormat_16BitARGB4444 = PIXEL_FORMAT_RGBA_4444 , // 16-bit ARGB
};
enum eColorConfig {
ColorConfig_KARGB4444 = SkBitmap::kARGB_4444_Config, //!< 16-bits per pixel, (see SkColorPriv.h for packing)
ColorConfig_KARGB8888 = SkBitmap::kARGB_8888_Config, //!< 32-bits per pixel, (see SkColorPriv.h for packing)
};
class LiveDrawService
{
public:
int open(int canvasId,int x,int y,int w,int h,ePixelFormat mPixelFormat,eColorConfig rgbConfig);
int close(int canvasId);
int closeAll();
int drawBuffer(int canvasId,void* picBuffer,int w,int h,int x,int y,int alphaValue,eColorConfig rgbConfig);
int clearCanvas(int canvasId);
int hideCanvas(int canvasId);
int showCanvas(int canvasId);
LiveDrawService();
~LiveDrawService();
};
class DvbCanvasManager
{
public:
sp<SurfaceComposerClient> videoClient;
sp<SurfaceControl> spSurCtrl ;
SurfaceControl* surContrl ;
sp<Surface> sur ;
SkCanvas* canvas ;
SkPaint* paint ;
int canvasWidth,canvasHeight;
eColorConfig mColorConfig;
int drawBuffer(void* picBuffer,int w,int h,int x,int y,eColorConfig rgbConfig,int alphaValue,bool isClearBefor);
int clearCanvas();
int hideCanvas();
int showCanvas();
int getBytesPerPixByRgbConfig(eColorConfig rgbConfig);
};
}//end namespace android
#endif // LIVEDRAWSERVICE_H
/************************************ cpp ***********************************************/
#include "LiveDrawService.h"
#include <stdlib.h>
#include <stdio.h>
#include <utils/Log.h>
using namespace android;
std::map<int,DvbCanvasManager> allCanvasMap;
int pid = -1;
SkColor color[2] = {0xaf00ff00,0xaf0000ff};
int indexColor = 1;
LiveDrawService::LiveDrawService()
{
pid = getpid();
//canvas 1
int buffer[500 * 100];
for(int i = 0 ;i < 20000;i++) {
buffer[i] = 0xff00ff00;
}
for(int i = 20000 ;i < 50000;i++) {
buffer[i] = 0xff0000ff;
}
open(1,500,150,300,500,PixelFormat_32BitRGBA,ColorConfig_KARGB8888);
drawBuffer(1,buffer,500,100,0,0,-1,ColorConfig_KARGB8888);
//canvas 2
int buffer2[100 * 1000];
for(int i = 0 ;i < 50000;i++) {
buffer2[i] = 0xff00ff00;
}
for(int i = 50000 ;i < 100000;i++) {
buffer2[i] = 0xff0000ff;
}
open(2,100,600,1200,100,PixelFormat_32BitRGBA,ColorConfig_KARGB8888);
drawBuffer(2,buffer2,1000,100,0,0,-1,ColorConfig_KARGB8888);
}
LiveDrawService::~LiveDrawService()
{
}
int LiveDrawService::open(int canvasId,int x,int y,int w,int h,ePixelFormat mPixelFormat,eColorConfig mColorConfig)
{
LOGI(" %s in [x=%d,y=%d,w=%d,h=%d]",__FUNCTION__,x,y,w,h);
std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
if(itCanvas == allCanvasMap.end()) {//not exist open it
LOGI("open new canvas!!");
DvbCanvasManager *oneCanvasManager = new DvbCanvasManager();
oneCanvasManager->videoClient = new SurfaceComposerClient;
if(oneCanvasManager->videoClient == NULL) {
LOGI("oneCanvasManager->videoClient = NULL!! return");
}
oneCanvasManager->spSurCtrl = oneCanvasManager->videoClient->createSurface(pid,0,w,h,mPixelFormat,0);
oneCanvasManager->surContrl = oneCanvasManager->spSurCtrl.get();
oneCanvasManager->sur = oneCanvasManager->surContrl->getSurface();
oneCanvasManager->mColorConfig = mColorConfig;
oneCanvasManager->videoClient->openTransaction();//set surface value
oneCanvasManager->spSurCtrl->setSize(w, h);
oneCanvasManager->spSurCtrl->setPosition(x, y);
oneCanvasManager->spSurCtrl->setLayer(1000000);
oneCanvasManager->spSurCtrl->hide();
oneCanvasManager->videoClient->closeTransaction();//end sets
SkBitmap* pBitmap = new SkBitmap();
pBitmap->setConfig((SkBitmap::Config)mColorConfig, w, h);
pBitmap->allocPixels();
Surface::SurfaceInfo info;
oneCanvasManager->sur->lock(&info); //set Surface to info,about x,y,w,h lock surface to get data form it
pBitmap->setPixels(info.bits); //build bitmap from info
oneCanvasManager->sur->unlockAndPost(); //release surface after get data
oneCanvasManager->canvas = new SkCanvas(*pBitmap); //build canvas form bitmap
oneCanvasManager->canvasWidth = w;
oneCanvasManager->canvasHeight = h;
oneCanvasManager->paint = new SkPaint();
oneCanvasManager->videoClient->openTransaction();
oneCanvasManager->spSurCtrl->show();
oneCanvasManager->videoClient->closeTransaction();
allCanvasMap.insert(std::make_pair(canvasId,*oneCanvasManager));
delete oneCanvasManager;
LOGI("open new canvas over!!");
}else {
LOGI("this canvasId is opened no need to open!! canvasId = %d",canvasId);
}
return 1;
}
int LiveDrawService::close(int canvasId)
{
allCanvasMap.erase(canvasId);
return 1;
}
int LiveDrawService::closeAll()
{
allCanvasMap.clear();
return 1;
}
/*******************
* LiveDrawService draw buffer
********************/
int LiveDrawService::drawBuffer(int canvasId,void* picBuffer,int w,int h,int x,int y,int alphaValue,eColorConfig rgbConfig)
{
LOGI(" %s in canvasId = %d!!",__FUNCTION__,canvasId);
std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
if(itCanvas == allCanvasMap.end()) {//not exist return
LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
return -1;
}else {
return (*itCanvas).second.drawBuffer(picBuffer,w,h,x,y,rgbConfig,alphaValue,true);
}
return -1;
}
int LiveDrawService::clearCanvas(int canvasId)
{
LOGI("%s in canvasId = %d!!",__FUNCTION__,canvasId);
std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
if(itCanvas == allCanvasMap.end()) {//not exist return
LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
return -1;
}else {
return (*itCanvas).second.clearCanvas();
}
}
int LiveDrawService::hideCanvas(int canvasId)
{
LOGI("%s in canvasId = %d!!",__FUNCTION__,canvasId);
std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
if(itCanvas == allCanvasMap.end()) {//not exist return
LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
return -1;
}else {
return (*itCanvas).second.hideCanvas();
}
}
int LiveDrawService::showCanvas(int canvasId)
{
LOGI("%s in canvasId = %d!!",__FUNCTION__,canvasId);
std::map<int,DvbCanvasManager>::iterator itCanvas = allCanvasMap.find(canvasId);
if(itCanvas == allCanvasMap.end()) {//not exist return
LOGI("%s in, canvasId = %d not getCanvas!!",__FUNCTION__,canvasId);
return -1;
}else {
return (*itCanvas).second.showCanvas();
}
}
/*******************
* draw buffer
********************/
int DvbCanvasManager::drawBuffer(void* picBuffer,int w,int h,int x,int y,eColorConfig rgbConfig,int alphaValue,bool isClearBefor)
{
LOGI(" %s in!! [w=%d,h=%d,x=%d,y=%d]",__FUNCTION__,w,h,x,y);
if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
if (Surface::isValid(sur)) {
if(isClearBefor) {
clearCanvas();
}
SkBitmap* pBitmap = new SkBitmap();
pBitmap->setConfig((SkBitmap::Config)rgbConfig, w , h ,w * getBytesPerPixByRgbConfig(rgbConfig));//w * pBitmap->bytesPerPixel()
pBitmap->allocPixels();
pBitmap->setPixels(picBuffer);
if(alphaValue > 0) {
paint->setAlpha(alphaValue);
}
SkIRect *mSkIRectSrc = new SkIRect();
mSkIRectSrc->set(0,0,w,h);
SkRect *mSkRectDest = new SkRect();
mSkRectDest->set(x,y,x + w,y + h);
canvas->drawBitmapRect(*pBitmap,mSkIRectSrc,*mSkRectDest,paint);
videoClient->openTransaction();
surContrl->show();
videoClient->closeTransaction();
delete pBitmap;
delete mSkIRectSrc;
delete mSkRectDest;
}else {
LOGI("Surface unvalide!!");
}
LOGI("%s draw success !!",__FUNCTION__);
return 1;
}else {
LOGI("%s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
}
return -1;
}
int DvbCanvasManager::clearCanvas()
{
LOGI("%s in!!",__FUNCTION__);
if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
canvas->drawColor(0x00ffffff);//not work,the color is over old
/*
SkBitmap* pBitmap = new SkBitmap();
pBitmap->setConfig((SkBitmap::Config)mColorConfig, canvasWidth , canvasHeight ,canvasWidth * getBytesPerPixByRgbConfig(mColorConfig));//w * pBitmap->bytesPerPixel()
pBitmap->allocPixels();
pBitmap->eraseARGB(0,0,0,0);
canvas->drawBitmap(*pBitmap,0,0);
*/
LOGI("%s over!!",__FUNCTION__);
}else {
LOGI(" %s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
}
return 1;
}
int DvbCanvasManager::hideCanvas()
{
LOGI("%s in!!",__FUNCTION__);
if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
videoClient->openTransaction();
surContrl->hide();
videoClient->closeTransaction();
}else {
LOGI(" %s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
}
return 1;
}
int DvbCanvasManager::showCanvas()
{
LOGI("%s in!!",__FUNCTION__);
if(sur != NULL && canvas != NULL && spSurCtrl != NULL) {
videoClient->openTransaction();
surContrl->show();
videoClient->closeTransaction();
}else {
LOGI(" %s : sur = null or canvas = null or spSurCtrl = null !!",__FUNCTION__);
}
return 1;
}
int DvbCanvasManager::getBytesPerPixByRgbConfig(eColorConfig rgbConfig)
{
int bytes = 2;
switch(rgbConfig)
{
case ColorConfig_KARGB4444 :
{
bytes = 2;
}
break;
case ColorConfig_KARGB8888 :
{
bytes = 4;
}
break;
default:
break;
}
return bytes ;
}