/* * Open the decoder, returns true on success */ bool CDVDVideoCodecA10::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { if (getenv("NOA10")) { CLog::Log(LOGNOTICE, "A10: disabled.\n"); return false; } if (hints.software) { CLog::Log(LOGNOTICE, "A10: software decoding requested.\n"); return false; } else { m_hwrender = getenv("A10HWR") != NULL; } CLog::Log(LOGNOTICE, "A10: using %s rendering.\n", m_hwrender ? "hardware" : "software"); m_hints = hints; m_aspect = m_hints.aspect; memset(&m_info, 0, sizeof(m_info)); //m_info.frame_rate = (double)m_hints.fpsrate / m_hints.fpsscale * 1000; m_info.frame_duration = 0; m_info.video_width = m_hints.width; m_info.video_height = m_hints.height; m_info.aspect_ratio = 1000; m_info.sub_format = CEDARV_SUB_FORMAT_UNKNOW; m_info.container_format = CEDARV_CONTAINER_FORMAT_UNKNOW; m_info.init_data_len = 0; m_info.init_data = NULL; #ifdef MEDIAINFO CLog::Log(LOGDEBUG, "A10: MEDIAINFO: CodecID %d \n", m_hints.codec); CLog::Log(LOGDEBUG, "A10: MEDIAINFO: StreamType %d \n", m_hints.type); CLog::Log(LOGDEBUG, "A10: MEDIAINFO: Level %d \n", m_hints.level); CLog::Log(LOGDEBUG, "A10: MEDIAINFO: Profile %d \n", m_hints.profile); CLog::Log(LOGDEBUG, "A10: MEDIAINFO: PTS_invalid %d \n", m_hints.ptsinvalid); CLog::Log(LOGDEBUG, "A10: MEDIAINFO: Tag %d \n", m_hints.codec_tag); { u8 *pb = (u8*)&m_hints.codec_tag; if (isalnum(pb[0]) && isalnum(pb[1]) && isalnum(pb[2]) && isalnum(pb[3])) CLog::Log(LOGDEBUG, "A10: MEDIAINFO: Tag fourcc %c%c%c%c\n", pb[0], pb[1], pb[2], pb[3]); } #endif switch(m_hints.codec) { //MPEG1 #ifdef A10ENABLE_MPEG1 case CODEC_ID_MPEG1VIDEO: m_info.format = CEDARV_STREAM_FORMAT_MPEG2; m_info.sub_format = CEDARV_MPEG2_SUB_FORMAT_MPEG1; break; #endif //MPEG2 #ifdef A10ENABLE_MPEG2 case CODEC_ID_MPEG2VIDEO: m_info.format = CEDARV_STREAM_FORMAT_MPEG2; m_info.sub_format = CEDARV_MPEG2_SUB_FORMAT_MPEG2; break; #endif //H263 #ifdef A10ENABLE_H263 case CODEC_ID_H263: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_H263; break; #endif //H264 #ifdef A10ENABLE_H264 case CODEC_ID_H264: m_info.format = CEDARV_STREAM_FORMAT_H264; m_info.init_data_len = m_hints.extrasize; m_info.init_data = (u8*)m_hints.extradata; if(m_hints.codec_tag==27) //M2TS and TS m_info.container_format = CEDARV_CONTAINER_FORMAT_TS; break; #endif //VP6 #ifdef A10ENABLE_VP6 case CODEC_ID_VP6F: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_VP6; //m_info.container_format = CEDARV_CONTAINER_FORMAT_FLV; break; #endif //WMV1 #ifdef A10ENABLE_WMV1 case CODEC_ID_WMV1: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_WMV1; break; #endif //WMV2 #ifdef A10ENABLE_WMV2 case CODEC_ID_WMV2: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_WMV2; break; #endif //WMV3 #ifdef A10ENABLE_WMV3 case CODEC_ID_WMV3: m_info.format = CEDARV_STREAM_FORMAT_VC1; m_info.init_data_len = m_hints.extrasize; m_info.init_data = (u8*)m_hints.extradata; break; #endif //VC1 and WVC1 #ifdef A10ENABLE_VC1_WVC1 case CODEC_ID_VC1: m_info.format = CEDARV_STREAM_FORMAT_VC1; m_info.init_data_len = m_hints.extrasize; m_info.init_data = (u8*)m_hints.extradata; break; #endif //MJPEG #ifdef A10ENABLE_MJPEG case CODEC_ID_MJPEG: m_info.format = CEDARV_STREAM_FORMAT_MJPEG; m_info.init_data_len = m_hints.extrasize; m_info.init_data = (u8*)m_hints.extradata; break; #endif //VP8 #ifdef A10ENABLE_VP8 case CODEC_ID_VP8: m_info.format = CEDARV_STREAM_FORMAT_VP8; m_info.init_data_len = m_hints.extrasize; m_info.init_data = (u8*)m_hints.extradata; break; #endif //MSMPEG4V1 #ifdef A10ENABLE_MPEG4V1 case CODEC_ID_MSMPEG4V1: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_DIVX1; break; #endif //MSMPEG4V2 #ifdef A10ENABLE_MPEG4V2 case CODEC_ID_MSMPEG4V2: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_DIVX2; break; #endif //MSMPEG4V3 #ifdef A10ENABLE_MPEG4V3 case CODEC_ID_MSMPEG4V3: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_DIVX3; break; #endif //Sorensson Spark (FLV1) #ifdef A10ENABLE_FLV1 case CODEC_ID_FLV1: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_SORENSSON_H263; //m_info.container_format = CEDARV_CONTAINER_FORMAT_FLV; break; #endif //Detected as MPEG4 (ID 13) case CODEC_ID_MPEG4: m_info.format = CEDARV_STREAM_FORMAT_MPEG4; switch(m_hints.codec_tag) { //DX40/DIVX4, divx #ifdef A10ENABLE_DIVX4 case _4CC('D','I','V','X'): m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_DIVX4; break; #endif //DX50/DIVX5 #ifdef A10ENABLE_DIVX5 case _4CC('D','X','5','0'): case _4CC('D','I','V','5'): m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_DIVX5; break; #endif //XVID #ifdef A10ENABLE_XVID case _4CC('X','V','I','D'): case _4CC('M','P','4','V'): case _4CC('P','M','P','4'): case _4CC('F','M','P','4'): m_info.sub_format = CEDARV_MPEG4_SUB_FORMAT_XVID; break; #endif default: CLog::Log(LOGERROR, "A10: (MPEG4)Codec Tag %d is unknown.\n", m_hints.codec_tag); return false; } break; default: CLog::Log(LOGERROR, "A10: codecid %d is unknown.\n", m_hints.codec); return false; } return DoOpen(); }
bool CDVDVideoCodecIMX::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { if (hints.software) { CLog::Log(LOGNOTICE, "iMX VPU : software decoding requested.\n"); return false; } m_hints = hints; if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "Let's decode with iMX VPU\n"); #ifdef MEDIAINFO if (g_advancedSettings.CanLogComponent(LOGVIDEO)) { CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: fpsrate %d / fpsscale %d\n", m_hints.fpsrate, m_hints.fpsscale); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: CodecID %d \n", m_hints.codec); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: StreamType %d \n", m_hints.type); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: Level %d \n", m_hints.level); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: Profile %d \n", m_hints.profile); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: PTS_invalid %d \n", m_hints.ptsinvalid); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: Tag %d \n", m_hints.codec_tag); CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: %dx%d \n", m_hints.width, m_hints.height); } { uint8_t *pb = (uint8_t*)&m_hints.codec_tag; if ((isalnum(pb[0]) && isalnum(pb[1]) && isalnum(pb[2]) && isalnum(pb[3])) && g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: Tag fourcc %c%c%c%c\n", pb[0], pb[1], pb[2], pb[3]); } if (m_hints.extrasize) { char buf[4096]; for (unsigned int i=0; i < m_hints.extrasize; i++) sprintf(buf+i*2, "%02x", ((uint8_t*)m_hints.extradata)[i]); if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: extradata %d %s\n", m_hints.extrasize, buf); } if (g_advancedSettings.CanLogComponent(LOGVIDEO)) { CLog::Log(LOGDEBUG, "Decode: MEDIAINFO: %d / %d \n", m_hints.width, m_hints.height); CLog::Log(LOGDEBUG, "Decode: aspect %f - forced aspect %d\n", m_hints.aspect, m_hints.forced_aspect); } #endif m_convert_bitstream = false; switch(m_hints.codec) { case CODEC_ID_MPEG1VIDEO: m_decOpenParam.CodecFormat = VPU_V_MPEG2; m_pFormatName = "iMX-mpeg1"; break; case CODEC_ID_MPEG2VIDEO: case CODEC_ID_MPEG2VIDEO_XVMC: m_decOpenParam.CodecFormat = VPU_V_MPEG2; m_pFormatName = "iMX-mpeg2"; break; case CODEC_ID_H263: m_decOpenParam.CodecFormat = VPU_V_H263; m_pFormatName = "iMX-h263"; break; case CODEC_ID_H264: if (m_hints.profile == 110) { CLog::Log(LOGNOTICE, "i.MX6 VPU is not able to decode AVC high 10 profile\n"); return false; } m_decOpenParam.CodecFormat = VPU_V_AVC; m_pFormatName = "iMX-h264"; if (hints.extradata) { if ( *(char*)hints.extradata == 1 ) { m_converter = new CBitstreamConverter(); m_convert_bitstream = m_converter->Open(hints.codec, (uint8_t *)hints.extradata, hints.extrasize, true); } } break; case CODEC_ID_VC1: m_decOpenParam.CodecFormat = VPU_V_VC1_AP; m_pFormatName = "iMX-vc1"; break; case CODEC_ID_CAVS: case CODEC_ID_AVS: m_decOpenParam.CodecFormat = VPU_V_AVS; m_pFormatName = "iMX-AVS"; break; case CODEC_ID_RV10: case CODEC_ID_RV20: case CODEC_ID_RV30: case CODEC_ID_RV40: m_decOpenParam.CodecFormat = VPU_V_RV; m_pFormatName = "iMX-RV"; break; case CODEC_ID_KMVC: m_decOpenParam.CodecFormat = VPU_V_AVC_MVC; m_pFormatName = "iMX-MVC"; break; case CODEC_ID_VP8: m_decOpenParam.CodecFormat = VPU_V_VP8; m_pFormatName = "iMX-vp8"; break; case CODEC_ID_MPEG4: switch(m_hints.codec_tag) { case _4CC('D','I','V','X'): m_decOpenParam.CodecFormat = VPU_V_XVID; // VPU_V_DIVX4 m_pFormatName = "iMX-divx4"; break; case _4CC('D','X','5','0'): case _4CC('D','I','V','5'): m_decOpenParam.CodecFormat = VPU_V_XVID; // VPU_V_DIVX56 m_pFormatName = "iMX-divx5"; break; case _4CC('X','V','I','D'): case _4CC('M','P','4','V'): case _4CC('P','M','P','4'): case _4CC('F','M','P','4'): m_decOpenParam.CodecFormat = VPU_V_XVID; m_pFormatName = "iMX-xvid"; break; default: CLog::Log(LOGERROR, "iMX VPU : MPEG4 codec tag %d is not (yet) handled.\n", m_hints.codec_tag); return false; } break; default: CLog::Log(LOGERROR, "iMX VPU : codecid %d is not (yet) handled.\n", m_hints.codec); return false; } return true; }