📄 dcc_display.c
字号:
master = EMHWLIB_MODULE(DispDigitalOut, 0); slave = EMHWLIB_MODULE(DispMainAnalogOut, 0); slave2 = EMHWLIB_MODULE(DispComponentOut, 0); slave3 = EMHWLIB_MODULE(DispCompositeOut, 0); switch (route) { case DCCRoute_Main: mixer = EMHWLIB_MODULE(DispMainMixer, 0); break; case DCCRoute_Secondary:#ifdef RMFEATURE_HAS_VCR_MIXER mixer = EMHWLIB_MODULE(DispVCRMixer, 0); break;#else return RM_ERROR;#endif case DCCRoute_ColorBars: mixer = EMHWLIB_MODULE(DispColorBars, 0); break; case DCCRoute_HDSD: return RM_ERROR; } colorspace = EMhwlibColorSpace_RGB_0_255; DCCSP(pDCC->pRUA, master, RMGenericPropertyID_ColorSpace, &colorspace, sizeof(colorspace)); DCCSP(pDCC->pRUA, master, RMDispDigitalOutPropertyID_BusSize, &bus_size, sizeof(bus_size)); /* BusSize might be Pending forever if called after TVFormat without Validate inbetween */ DCCSP(pDCC->pRUA, master, RMGenericPropertyID_DigitalTVFormat, fmt_d, sizeof(*fmt_d)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_SyncSourceModuleID, &master, sizeof(master)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_AddSlaveOutput, &slave, sizeof(slave)); { RMbool DoubleRate = DCCGetDoubleRate(EMhwlibTVStandard_Custom); RMDBGLOG((LOCALDBG, "Applying DoubleRate(%s)\n", DoubleRate ? "TRUE" : "FALSE")); DCCSP(pDCC->pRUA, DispDigitalOut, RMDispDigitalOutPropertyID_DoubleRate, &DoubleRate, sizeof(DoubleRate)); } DCCSP(pDCC->pRUA, master, RMGenericPropertyID_Validate, NULL, 0); enable = TRUE; DCCSP(pDCC->pRUA, master, RMGenericPropertyID_Enable, &enable, sizeof(enable)); DCCSP(pDCC->pRUA, slave, RMGenericPropertyID_SyncSourceModuleID, &master, sizeof(master)); DCCSP(pDCC->pRUA, slave, RMDispMainAnalogOutPropertyID_TVFormat, fmt_a, sizeof(*fmt_a)); DCCSP(pDCC->pRUA, slave, RMGenericPropertyID_Validate, NULL, 0); enable = TRUE; DCCSP(pDCC->pRUA, slave, RMGenericPropertyID_Enable, &enable, sizeof(enable)); disp_route.Enable = TRUE; disp_route.SourceModuleID = mixer; disp_route.DestinationModuleID = master; DCCSP(pDCC->pRUA, routing, RMDispRoutingPropertyID_Route, &disp_route, sizeof(disp_route)); /* enable slave out */ disp_route.Enable = TRUE; disp_route.SourceModuleID = mixer; disp_route.DestinationModuleID = slave; DCCSP(pDCC->pRUA, routing, RMDispRoutingPropertyID_Route, &disp_route, sizeof(disp_route));#ifdef RMFEATURE_HAS_COMPONENT_OUT /* add component out on mambo configuration */ DCCSP(pDCC->pRUA, slave2, RMGenericPropertyID_SyncSourceModuleID, &master, sizeof(master)); DCCSP(pDCC->pRUA, slave2, RMDispComponentOutPropertyID_TVFormat, fmt_a, sizeof(*fmt_a)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_AddSlaveOutput, &slave2, sizeof(slave2)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_Validate, NULL, 0); DCCSP(pDCC->pRUA, slave2, RMGenericPropertyID_Validate, NULL, 0); enable = TRUE; DCCSP(pDCC->pRUA, slave2, RMGenericPropertyID_Enable, &enable, sizeof(enable)); /* enable slave2 out */ disp_route.Enable = TRUE; disp_route.SourceModuleID = mixer; disp_route.DestinationModuleID = slave2; DCCSP(pDCC->pRUA, routing, RMDispRoutingPropertyID_Route, &disp_route, sizeof(disp_route));#endif // RMFEATURE_HAS_COMPONENT_OUT#ifdef RMFEATURE_HAS_COMPOSITE_OUT /* add composite out on mambo configuration */ if (fmt_a->CompositeMode != EMhwlibCompositeMode_Disable) { DCCSP(pDCC->pRUA, slave3, RMGenericPropertyID_SyncSourceModuleID, &master, sizeof(master)); DCCSP(pDCC->pRUA, slave3, RMDispCompositeOutPropertyID_TVFormat, fmt_a, sizeof(*fmt_a)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_AddSlaveOutput, &slave3, sizeof(slave2)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_Validate, NULL, 0); DCCSP(pDCC->pRUA, slave3, RMGenericPropertyID_Validate, NULL, 0); enable = TRUE; DCCSP(pDCC->pRUA, slave3, RMGenericPropertyID_Enable, &enable, sizeof(enable)); /* enable slave3 out */ disp_route.Enable = TRUE; disp_route.SourceModuleID = mixer; disp_route.DestinationModuleID = slave3; DCCSP(pDCC->pRUA, routing, RMDispRoutingPropertyID_Route, &disp_route, sizeof(disp_route)); } else { /* disable slave3 out */ disp_route.Enable = FALSE; disp_route.SourceModuleID = mixer; disp_route.DestinationModuleID = slave3; DCCSP(pDCC->pRUA, routing, RMDispRoutingPropertyID_Route, &disp_route, sizeof(disp_route)); DCCSP(pDCC->pRUA, routing, RMGenericPropertyID_Validate, NULL, 0); enable = FALSE; DCCSP(pDCC->pRUA, slave3, RMGenericPropertyID_Enable, &enable, sizeof(enable)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_RemoveSlaveOutput, &slave3, sizeof(slave3)); DCCSP(pDCC->pRUA, master, RMGenericPropertyID_Validate, NULL, 0); }#endif // RMFEATURE_HAS_COMPOSITE_OUT DCCSP(pDCC->pRUA, routing, RMGenericPropertyID_Validate, NULL, 0); enable = TRUE; DCCSP(pDCC->pRUA, routing, RMGenericPropertyID_Enable, &enable, sizeof(enable)); return RM_OK;}RMstatus DCCSetSCART(struct DCC *pDCC, enum DCCRoute route, enum DCCVideoConnector connector, RMbool Enable, RMuint32 EnableBit, RMbool EnableInvert, RMuint32 WideBit, RMbool WideInvert, enum EMhwlibSCARTWideBitState WideState){ RMstatus err; RMuint32 output; struct EMhwlibSCARTConfig conf; if (RMFAILED(err = DCCGetVideoConnectorModuleID(pDCC, route, connector, &output))) return err; conf.EnableBit = EnableBit; conf.EnableInvert = EnableInvert; conf.WideBit = WideBit; conf.WideInvert = WideInvert; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_SCARTConfig, &conf, sizeof(conf)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_SCARTWideScreen, &WideState, sizeof(WideState)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_SCART, &Enable, sizeof(Enable)); return RM_OK;}RMstatus DCCEnableVideoConnector(struct DCC *pDCC, enum DCCRoute route, enum DCCVideoConnector connector, RMbool enable){ RMuint32 output, mixer=0; RMstatus err; enum EMhwlibComponentMode compmode; enum EMhwlibColorSpace colorspace; switch (route) { case DCCRoute_Main: mixer = EMHWLIB_MODULE(DispMainMixer, 0); break; case DCCRoute_Secondary:#ifdef RMFEATURE_HAS_VCR_MIXER mixer = EMHWLIB_MODULE(DispVCRMixer, 0); break;#else return RM_ERROR;#endif case DCCRoute_ColorBars: mixer = EMHWLIB_MODULE(DispColorBars, 0); break; case DCCRoute_HDSD: return RM_ERROR; } if (RMFAILED(err = DCCGetVideoConnectorModuleID(pDCC, route, connector, &output))) return err; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Enable, &enable, sizeof(enable)); switch (connector) { case DCCVideoConnector_DVI: case DCCVideoConnector_LVDS: case DCCVideoConnector_Digital: // ColorSpace has been set up already DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_SyncControlModuleID, &output, sizeof(output)); DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_EnableSyncPAD, &enable, sizeof(enable)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); break; case DCCVideoConnector_VGA: DCCSP(pDCC->pRUA, DispDigitalOut, RMDispDigitalOutPropertyID_SyncControlModuleID, &output, sizeof(output)); DCCSP(pDCC->pRUA, DispDigitalOut, RMDispDigitalOutPropertyID_EnableSyncPAD, &enable, sizeof(enable)); DCCSP(pDCC->pRUA, DispDigitalOut, RMGenericPropertyID_Validate, NULL, 0); DCCSP(pDCC->pRUA, DispDigitalOut, RMGenericPropertyID_Enable, &enable, sizeof(enable)); compmode = EMhwlibComponentMode_RGB_SCART; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ComponentMode, &compmode, sizeof(compmode)); colorspace = EMhwlibColorSpace_RGB_0_255; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ColorSpace, &colorspace, sizeof(colorspace)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); break; case DCCVideoConnector_SCART: compmode = EMhwlibComponentMode_RGB_SCART; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ComponentMode, &compmode, sizeof(compmode)); colorspace = EMhwlibColorSpace_RGB_0_255; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ColorSpace, &colorspace, sizeof(colorspace)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); break; case DCCVideoConnector_COMPONENT: // ColorSpace has been set up already for component. // Set up colorspace for composite also colorspace = EMhwlibColorSpace_YUV_601;#ifdef RMFEATURE_HAS_DUAL_MAINANALOGOUT DCCSP(pDCC->pRUA, output, RMDispMainAnalogOutPropertyID_ColorSpaceCVBS, &colorspace, sizeof(colorspace));#endif // RMFEATURE_HAS_DUAL_MAINANALOGOUT DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); break; case DCCVideoConnector_SVIDEO: case DCCVideoConnector_COMPOSITE: colorspace = EMhwlibColorSpace_YUV_601;#ifdef RMFEATURE_HAS_DUAL_MAINANALOGOUT DCCSP(pDCC->pRUA, output, RMDispMainAnalogOutPropertyID_ColorSpaceCVBS, &colorspace, sizeof(colorspace));#else DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ColorSpace, &colorspace, sizeof(colorspace));#endif // RMFEATURE_HAS_DUAL_MAINANALOGOUT DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); break; } return RM_OK;}RMstatus DCCGetVideoConnectorModuleID(struct DCC *pDCC, enum DCCRoute route, enum DCCVideoConnector connector, RMuint32 *moduleID){ // TODO the output connectors are board- and chip-dependent! // We need a board/chip table // e.g. // board 716, chip 8610L, connector: vga==>DispComponentOut, cvbs,svideo,component==>DispMainAnalogOut, dvi==>DispDigitalOut // board 716, chip 8620L, connector: vga,cvbs,svideo,component==>DispMainAnalogOut, dvi==>DispDigitalOut // or we need to give the user a choice, e.g. vga_component, vga_main, scart_composite etc. switch (route) { case DCCRoute_Main: case DCCRoute_Secondary: case DCCRoute_ColorBars: case DCCRoute_HDSD: switch (connector) { case DCCVideoConnector_DVI: case DCCVideoConnector_LVDS: case DCCVideoConnector_Digital: *moduleID = EMHWLIB_MODULE(DispDigitalOut, 0); break; case DCCVideoConnector_VGA:#ifndef RMFEATURE_HAS_COMPONENT_OUT *moduleID = EMHWLIB_MODULE(DispMainAnalogOut, 0);#else *moduleID = EMHWLIB_MODULE(DispComponentOut, 0);#endif break; case DCCVideoConnector_SCART: case DCCVideoConnector_COMPONENT:#ifndef RMFEATURE_HAS_COMPONENT_OUT *moduleID = EMHWLIB_MODULE(DispMainAnalogOut, 0);#else *moduleID = EMHWLIB_MODULE(DispComponentOut, 0);#endif break; case DCCVideoConnector_SVIDEO: *moduleID = EMHWLIB_MODULE(DispMainAnalogOut, 0); break; case DCCVideoConnector_COMPOSITE:#ifndef RMFEATURE_HAS_COMPOSITE_OUT *moduleID = EMHWLIB_MODULE(DispMainAnalogOut, 0);#else *moduleID = EMHWLIB_MODULE(DispCompositeOut, 0);#endif break; } break; } return RM_OK;}RMstatus DCCSetDVIOutFormat(struct DCC *pDCC, enum DCCRoute route, enum EMhwlibColorSpace color_space, enum EMhwlibDigitalTimingSignal timing, RMuint32 bus_size){ RMuint32 output; enum EMhwlibColorOrder ColorOrder = EMhwlibColorOrder_RGB; RMbool clipping; enum DispDigitalOut_ClippingLevel_type level; output = EMHWLIB_MODULE(DispDigitalOut, 0); clipping = FALSE; DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_EnableClipping, &clipping, sizeof(clipping)); level = DispDigitalOut_ClippingLevel_Clip_1_254; DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_ClippingLevel, &level, sizeof(level)); DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_ColorOrder, &ColorOrder, sizeof(ColorOrder)); DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_TimingSignal, &timing, sizeof(timing)); DCCSP(pDCC->pRUA, output, RMDispDigitalOutPropertyID_BusSize, &bus_size, sizeof(bus_size)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ColorSpace, &color_space, sizeof(color_space)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); return RM_OK;}RMstatus DCCSetComponentOutFormat(struct DCC *pDCC, enum DCCRoute route, enum EMhwlibColorSpace color_space, enum EMhwlibComponentMode component){ RMuint32 output; RMstatus err = RM_OK; if (RMFAILED(err = DCCGetVideoConnectorModuleID(pDCC, route, DCCVideoConnector_COMPONENT, &output))) return err; DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ColorSpace, &color_space, sizeof(color_space)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_ComponentMode, &component, sizeof(component)); DCCSP(pDCC->pRUA, output, RMGenericPropertyID_Validate, NULL, 0); return RM_OK;}RMstatus DCCEnableSPUSurface(struct DCC *pDCC, enum DCCRoute route, RMuint32 index, struct DCCVideoSource *pVideoSource, RMbool enable){ RMuint32 spu_scaler, src_index; RMuint32 mixer=0; RMuint32 video_scaler; RMstatus err; enum EMhwlibMixerSourceState state; struct EMhwlibSubPictureSurface_type spu_surface; switch (route) { case DCCRoute_Main: mixer = EMHWLIB_MODULE(DispMainMixer, 0); break; case DCCRoute_Secondary:#ifdef RMFEATURE_HAS_VCR_MIXER mixer = EMHWLIB_MODULE(DispVCRMixer, 0); break;#else return RM_ERROR;#endif case DCCRoute_ColorBars: RMDBGLOG((ENABLE, "No spu on colorbars route\n")); return RM_ERROR; case DCCRoute_HDSD: return RM_ERROR; } err = DCCGetScalerModuleID(pDCC, route, DCCSurface_SPU, index, &spu_scaler); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Cannot get spu surface scaler\n")); return err; } err = DCCGetScalerModuleID(pDCC, route, DCCSurface_Video, index, &video_scaler); if (RMFAILED(err)) { RMDBGLOG((ENABLE, "Cannot get video surface scaler\n")); return err; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -