omx_egl_render/*dec*/=NULL;
buf_head_egl=NULL;
+ curformat = Unsupported;
}
ImageOMX::~ImageOMX()
ft_type.nPortIndex=omx_image_input_port;
- ft_type.eCompressionFormat=OMX_IMAGE_CodingJPEG;
+ switch (curformat)
+ {
+ case Jpeg: ft_type.eCompressionFormat=OMX_IMAGE_CodingJPEG;
+ break;
+ case PNG: ft_type.eCompressionFormat=OMX_IMAGE_CodingPNG;
+ break;
+ }
+
error=OMX_SetParameter(omx_imag_decode,OMX_IndexParamImagePortFormat,&ft_type);
if (error!=OMX_ErrorNone){
// Log::getInstance()->log("Image", Log::DEBUG,
// "decodePicture 1");
EGLPictureCreator * pictcreat =dynamic_cast<EGLPictureCreator*>(Osd::getInstance());
- if (buffer[0]!= 0xff || buffer[1] !=0xd8) return false; // Jpeg magic numbers
+ curformat=Unsupported;
+ if (buffer[0]== 0xff && buffer[1] ==0xd8) curformat=Jpeg;
+ if (buffer[0]== 0x89 && buffer[1] ==0x50 && buffer[2] ==0x4e) curformat=PNG;
+
+ if (curformat == Unsupported) return buffer; // Jpeg magic numbers
// Log::getInstance()->log("Image", Log::DEBUG,
// "decodePicture 2");
VideoOMX *video=(VideoOMX*)Video::getInstance();
return false;
}*/
+ switch (curformat)
+ {
+ case Jpeg:
+ port_def_type.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
+ port_def_type.format.image.nSliceHeight = 16;
+ port_def_type.format.image.nStride = 0;
+ break;
+ case PNG:
+ //port_def_type.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
+ //port_def_type.format.image.nSliceHeight = 32;
+ //port_def_type.format.image.nStride = 0;
+ port_def_type.format.image.nFrameHeight+=-(port_def_type.format.image.nFrameHeight%32); // The OpenMax png part is broken for the last slice
+ // so we cut the broken part, not nice but works
+ break;
+ }
+
+
+
- port_def_type.format.image.eColorFormat = OMX_COLOR_FormatYUV420PackedPlanar;
- port_def_type.format.image.nSliceHeight = 16;
- port_def_type.format.image.nStride = 0;
error = OMX_SetParameter(omx_imag_decode, OMX_IndexParamPortDefinition,
&port_def_type);
if (error != OMX_ErrorNone) {
int DestroyInputBufsOMX();
int DestroyInputBufsOMXwhilePlaying();
+ enum ImageFormats {
+ Unsupported,
+ Jpeg,
+ PNG
+ };
+
+ enum ImageFormats curformat;
+
vector<OMX_BUFFERHEADERTYPE*> input_bufs_omx_all;
Log::getInstance()->log("OSD", Log::NOTICE, "Displaysize is %d x %d ",display_width, display_height);
VC_RECT_T dst_rect ={0,0,display_width,display_height};
VC_RECT_T src_rect={0,0,BACKBUFFER_WIDTH <<16,BACKBUFFER_HEIGHT<<16};
- // VC_RECT_T src_rect_bg={0,0,1<<16,1<<16};
- // VC_RECT_T src_rect_im={0,0,1,1};
-
- /* uint32_t back_image_ptr;
- bcm_backres=vc_dispmanx_resource_create(VC_IMAGE_RGB888,1,1,&back_image_ptr);
- unsigned int color=0x00FF0000;
- vc_dispmanx_resource_write_data(bcm_backres,VC_IMAGE_RGB888,4,&color,&src_rect_im);*/
+ VC_RECT_T src_rect_bg={0,0,16<<16,16<<16};
+ VC_RECT_T src_rect_im={0,0,16,16};
+
+ uint32_t back_image_ptr;
+ bcm_backres=vc_dispmanx_resource_create(VC_IMAGE_RGBX32,16,16,&back_image_ptr);
+ unsigned int color[16*16];
+ //memset(color,0xFF,sizeof(unsigned int)*4*8);
+ for (int j=0;j<16;j++) {
+ int help=j;
+ //unsigned int cur_col=help | (help<< 8) | (help<< 16) | (0xFF<< 24);
+ unsigned int cur_col=help *3 | (help<< (8+2)) | (help<< (16+2)) | (0xFF<< (24));
+ for (int i=0;i<16;i++) {
+ color[i+16*j]=cur_col;
+ }
+ }
+ vc_dispmanx_resource_write_data(bcm_backres,VC_IMAGE_RGBX32,16*4,color,&src_rect_im);
DISPMANX_UPDATE_HANDLE_T bcm_update;
bcm_display=vc_dispmanx_display_open(0);
&src_rect,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);
- /* bcm_background=vc_dispmanx_element_add(bcm_update,bcm_display,
+ bcm_background=vc_dispmanx_element_add(bcm_update,bcm_display,
0,&dst_rect,bcm_backres ,
- &src_rect_bg,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);*/
+ &src_rect_bg,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);
vc_dispmanx_update_submit_sync(bcm_update);
/*if (((VideoOMX*)Video::getInstance())->initUsingOSDObjects()!=1) { //call Video for init stuff
return 0;
}*/
- // InitializeMagick("");
-
threadStart();
bcm_update=vc_dispmanx_update_start(0);
vc_dispmanx_element_remove(bcm_update,bcm_element);
-// vc_dispmanx_element_remove(bcm_update,bcm_background);
+ vc_dispmanx_element_remove(bcm_update,bcm_background);
vc_dispmanx_update_submit_sync(bcm_update);
-// vc_dispmanx_resource_delete(bcm_backres);
+ vc_dispmanx_resource_delete(bcm_backres);
vc_dispmanx_display_close(bcm_display);
vgTranslate(tx,ty);
//vgScale(command.w/imagewidth,command.h/imageheight);
vgScale(scalex,scaley);
+ vgSeti(VG_BLEND_MODE, VG_BLEND_SRC_OVER);
vgSeti(VG_IMAGE_MODE,VG_DRAW_IMAGE_NORMAL);
- //Log::getInstance()->log("OSD", Log::DEBUG, "Draw Image Scale %g %g %g %g %g %g",command.w,imagewidth,command.h,imageheight,scalex,scaley);
+ //Log::getInstance()->log("OSD", Log::DEBUG, "TVMedia Draw Image Scale %g %g %g %g %g %g",command.w,imagewidth,command.h,imageheight,scalex,scaley);
}
// vgGetError());
if (command.reference) {
vgSeti(VG_IMAGE_MODE,VG_DRAW_IMAGE_NORMAL);
- vgSeti(VG_BLEND_MODE, VG_BLEND_SRC);
vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
vgLoadMatrix(save_matrix2);
}
+ vgSeti(VG_BLEND_MODE, VG_BLEND_SRC);
vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
vgLoadMatrix(save_matrix);
PictureInfo *info = (PictureInfo*) command.data;
VGImage handle;
//Log::getInstance()->log("OSD", Log::DEBUG, "TVMedia OVGcreateImageMemory");
- handle=vgCreateImage(VG_sXBGR_8888,info->width,info->height,VG_IMAGE_QUALITY_BETTER);
+ handle=vgCreateImage(VG_sABGR_8888,info->width,info->height,VG_IMAGE_QUALITY_BETTER);
vgImageSubData(handle,info->image,info->width*4,
- VG_sXBGR_8888,0,0,info->width,info->height);
+ VG_sABGR_8888,0,0,info->width,info->height);
info->decoder->freeReference(info->reference);
bool static_image=true;
case OVGcreateEGLImage: {
PictureInfo *info = (PictureInfo*) command.data;
VGImage handle;
- //Log::getInstance()->log("OSD", Log::DEBUG, "TVMedia OVGcreateImageMemory");
- handle=vgCreateImage(VG_sXBGR_8888,info->width,info->height,VG_IMAGE_QUALITY_BETTER);
+ //Log::getInstance()->log("OSD", Log::DEBUG, "TVMedia OVGcreateImageMemory %d %d",info->width,info->height);
+ handle=vgCreateImage(VG_sABGR_8888,info->width,info->height,VG_IMAGE_QUALITY_BETTER);
info->handle = handle;
info->reference = eglCreateImageKHR(egl_display, egl_context, EGL_VG_PARENT_IMAGE_KHR, (EGLClientBuffer)handle, NULL);
uint32_t display_width;
DISPMANX_DISPLAY_HANDLE_T bcm_display;
DISPMANX_ELEMENT_HANDLE_T bcm_element;
-// DISPMANX_ELEMENT_HANDLE_T bcm_background;
-// DISPMANX_RESOURCE_HANDLE_T bcm_backres;
+ DISPMANX_ELEMENT_HANDLE_T bcm_background;
+ DISPMANX_RESOURCE_HANDLE_T bcm_backres;
uint32_t mode;
case 5:
index=VDR::getInstance()->loadTVMediaEventThumb(tvmedia);
break;
+ case 6:
+ index=VDR::getInstance()->loadChannelLogo(tvmedia);
+ break;
default:
index=VDR::getInstance()->loadTVMedia(tvmedia);
break;
}
//Log::getInstance()->log("OsdVector", Log::DEBUG, "TVMedia Sleep Picture Reader");
+ struct timespec target_time;
+ clock_gettime(CLOCK_REALTIME,&target_time);
+ target_time.tv_nsec+=1000000LL*10;
+ if (target_time.tv_nsec>999999999) {
+ target_time.tv_nsec-=1000000000L;
+ target_time.tv_sec+=1;
+ }
threadLock();
- threadWaitForSignal();
+ threadWaitForSignalTimed(&target_time);
threadUnlock();
//Log::getInstance()->log("OsdVector", Log::DEBUG, "TVMedia Sleep end Picture Reader");
}
delete vresp;
return true;
}
+ // Log::getInstance()->log("OsdVector", Log::DEBUG, "TVMedia Pictures arrived VDR %x %d %d",
+ // vresp->getStreamID(),vresp->getUserDataLength(),vresp->getFlag());
if (vresp->getFlag() != 2) {
UCHAR *userdata=vresp->getUserData();
ULONG length=vresp->getUserDataLength();
}
+ if (pict_incoming.size() || pict_incoming_static.size()) return true;
return decoded;
}
void VChannelList::setList(ChannelList* tlist)
{
char str[500];
+ OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
sl.addColumn(0);
+ if (osdv) sl.addColumn(20);
sl.addColumn(60);
chanList = tlist;
int first = 1;
if (chanList)
{
+
for (UINT i = 0; i < chanList->size(); i++)
{
chan = (*chanList)[i];
sprintf(str, "%lu\t%s", chan->number, chan->name);
- chan->index = sl.addOption(str, (ULONG)chan, first);
+ TVMediaInfo *info=NULL;
+ if (osdv) {
+ info= new TVMediaInfo();
+ info->setChannelLogo((*chanList)[i]->number);
+ }
+ chan->index = sl.addOption(str, (ULONG)chan, first, info);
first = 0;
}
}
{
// It's TVMedia
VDR_ResponsePacket* vresp = (VDR_ResponsePacket*)userTag;
- Log::getInstance()->log("VDR", Log::DEBUG, "TVMedia Pictures arrived VDR");
+ Log::getInstance()->log("VDR", Log::DEBUG, "TVMedia Pictures arrived VDR %x",vresp->getStreamID());
OsdVector *osd=dynamic_cast<OsdVector*>(Osd::getInstance());
if (osd) osd->getPictReader()->receivePicture(vresp);
else delete vresp; //nonsense
if (!vrp.addULONG(tvmedia.type_pict)) return -1;
if (!vrp.addULONG(tvmedia.container)) return -1;
if (!vrp.addULONG(tvmedia.container_member)) return -1;
- Log::getInstance()->log("VDR", Log::DEBUG, "TVMedia with ID %d %d; %d %d %d %d;%d",
+/* Log::getInstance()->log("VDR", Log::DEBUG, "TVMedia with ID %d %d; %d %d %d %d;%d",
tvmedia.primary_id,tvmedia.secondary_id,tvmedia.type,tvmedia.type_pict,
- tvmedia.container,tvmedia.container_member,vrp.getSerial());
+ tvmedia.container,tvmedia.container_member,vrp.getSerial());*/
VDR_PacketReceiver* vdrpr = new VDR_PacketReceiver();
return vrp.getSerial();
}
+
+ULONG VDR::loadChannelLogo(TVMediaInfo & media)
+{
+
+ VDR_RequestPacket vrp;
+
+ if (!vrp.init(VDR_LOADCHANNELLOGO, false, 0)) return -1;
+ if (!vrp.addULONG(media.primary_id)) return NULL;
+
+ VDR_PacketReceiver* vdrpr = new VDR_PacketReceiver();
+ vdrpr->receiverChannel = VDR::CHANNEL_TVMEDIA;
+ vdrpr->streamID = vrp.getSerial();
+ vdrpr->streamReceiver = NULL;
+ edRegister(vdrpr);
+
+
+ VDR_ResponsePacket* vresp = RequestResponse(&vrp);
+ //if (vresp->noResponse()) { delete vresp; return -1; }
+ delete vresp;
+
+// Log::getInstance()->log("VDR", Log::DEBUG, "TVMedia Channel Logo %d %x",
+// media.primary_id,vrp.getSerial());
+
+ return vrp.getSerial();
+}
ULONG loadTVMedia(TVMediaInfo& tvmedia);
ULONG loadTVMediaRecThumb(TVMediaInfo& tvmedia);
ULONG loadTVMediaEventThumb(TVMediaInfo& tvmedia);
+ ULONG loadChannelLogo(TVMediaInfo& tvmedia);
void invalidateTVMedia(ULONG loadindex);
const static ULONG VDR_LOADTVMEDIARECTHUMB = 42;
const static ULONG VDR_GETEVENTSCRAPEREVENTTYPE = 43;
const static ULONG VDR_LOADTVMEDIAEVENTTHUMB = 44;
+const static ULONG VDR_LOADCHANNELLOGO = 45;
const static ULONG VDR_SHUTDOWN = 666;
class VDR_Command : public SerializableList {
int saveTop = sl.getTopOption();
sl.clear();
sl.addColumn(0);
- sl.addColumn(25 );
+ sl.addColumn(42 );
sl.addColumn(160);
int first = 1;
TBBoxx::draw();
+ TVMediaInfo info;
+ info.setChannelLogo(channelNumber);
+
+
+
char freeSpace[50];
struct tm* btime;
time_t now;
time(&now);
btime = localtime(&now);
strftime(freeSpace, 299, "%d/%m/%y", btime);
- drawTextRJ(freeSpace, 560+70, 5, DrawStyle::LIGHTTEXT);
+ if (mode == OneChannel) {
+ drawTVMedia(info,getWidth(),0.f,0,30.f,TopRight);
+ drawTextRJ(freeSpace, getWidth()-30, 5, DrawStyle::LIGHTTEXT);
+ } else {
+ drawTextRJ(freeSpace, getWidth(), 5, DrawStyle::LIGHTTEXT);
+ }
// Symbols
WSymbol w;
epgTVmedia.setTVMedia(poster.info, WTVMedia::ZoomHorizontal);
epgTVmedia.setVisible(true);
} else {
- epgTVmedia.setVisible(false);
+ if (mode!=OneChannel) {
+ TVMediaInfo info;
+ info.setChannelLogo(channel);
+ epgTVmedia.setTVMedia(info, WTVMedia::ZoomHorizontal);
+ epgTVmedia.setVisible(true);
+ } else {
+ epgTVmedia.setVisible(false);
+ }
}
epg.setText(description.str().c_str());
} else {
epg.setText("");
- epgTVmedia.setVisible(false);
+ if (mode!=OneChannel) {
+ TVMediaInfo info;
+ info.setChannelLogo(channel);
+ epgTVmedia.setTVMedia(info, WTVMedia::ZoomHorizontal);
+ epgTVmedia.setVisible(true);
+ } else {
+ epgTVmedia.setVisible(false);
+ }
}
}
// This is only used on old remotes to stop up/down buttons being used for osd-epg scrolling
okTriggeredOSD = false;
+ TVMediaInfo info;
+ info.setChannelLogo(initialChannelNumber);
+ OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
+
+ if (osdv && streamType == VDR::RADIO) {
+ radioChannelLogo.setPosition(video->getScreenWidth()/4,video->getScreenHeight()/4);
+ radioChannelLogo.setSize(video->getScreenWidth()/2,video->getScreenHeight()/2);
+ radioChannelLogo.setVisible(true);
+ radioChannelLogo.setTVMedia(info, WTVMedia::ZoomVertical);
+ add(&radioChannelLogo);
+ }
+
osdposterbanner.setPosition(20,20);
osdposterbanner.setBackgroundColour(osdBack);
osdposterbanner.setSize(video->getScreenWidth()*4/10,video->getScreenHeight()*4/10);
add(&osdposterbanner);
+
osd.setBackgroundColour(osdBack);
osd.setPosition(0, video->getScreenHeight() - 150);
osd.setSize(video->getScreenWidth(), 150);
osd.setVisible(false);
add(&osd);
+ int channellogomove=0;
+ if (osdv) {
+ osdChannelLogo.setBackgroundColour(osdBack);
+ osdChannelLogo.setPosition(30,5);
+ osdChannelLogo.setSize(60,60);
+ osdChannelLogo.setTVMedia(info, WTVMedia::ZoomVertical);
+ osd.add(&osdChannelLogo);
+ channellogomove=30-5;
+ }
clock.setBackgroundColour(osdBack);
clock.setPosition(osd.getWidth() - 100, 4);
osd.add(&clock);
osdChanNum.setBackgroundColour(osdBack);
- osdChanNum.setPosition(50, 4);
- osdChanNum.setSize((numberWidth*10) + 22, 30); // 10 px = width of number chars in font
+ osdChanNum.setPosition(60+channellogomove, 4);
+ osdChanNum.setSize((numberWidth*10) + 22, getFontHeight()+5); // 10 px = width of number chars in font
osd.add(&osdChanNum);
osdChanName.setBackgroundColour(osdBack);
osd.add(&textBlue);
sl.setBackgroundColour(osdBack);
- sl.setPosition(70, 36);
- sl.setSize(500, 58);
+ sl.setPosition(90, 36);
+ sl.setSize(480, 58);
sl.setNoLoop();
osd.add(&sl);
textUnavailable.setVisible(false);
}
+ OsdVector *osdv=dynamic_cast<OsdVector*>(Osd::getInstance());
+ if (osdv) {
+ TVMediaInfo info;
+ Channel* currentChannel = (*chanList)[currentChannelIndex];
+ if (currentChannel) {
+ info.setChannelLogo(currentChannel->number);
+ if (streamType == VDR::RADIO) {
+ radioChannelLogo.setTVMedia(info, WTVMedia::ZoomVertical);
+ radioChannelLogo.setVisible(true);
+ }
+ osdChannelLogo.setTVMedia(info, WTVMedia::ZoomVertical);
+
+ }
+ }
- draw();
- BoxStack::getInstance()->update(this);
+ draw();
+ BoxStack::getInstance()->update(this);
return true;
}
WSymbol sAudioChannels;
WTextbox textUnavailable;
WTVMedia osdposterbanner;
+ WTVMedia radioChannelLogo;
+ WTVMedia osdChannelLogo;
Boxx summary;
WTextbox textSummary;