void aml_set_audio_passthrough(bool passthrough) { if ( aml_present() && aml_get_device_type() != AML_DEVICE_TYPE_UNKNOWN && aml_get_device_type() <= AML_DEVICE_TYPE_M8) { // m1 uses 1, m3 and above uses 2 int raw = aml_get_device_type() == AML_DEVICE_TYPE_M1 ? 1:2; SysfsUtils::SetInt("/sys/class/audiodsp/digital_raw", passthrough ? raw:0); } }
void CLinuxInputDevice::SetupKeyboardAutoRepeat(int fd) { bool enable = true; #if defined(HAS_LIBAMCODEC) if (aml_get_device_type() == AML_DEVICE_TYPE_M1 || aml_get_device_type() == AML_DEVICE_TYPE_M3) { // ignore the native aml driver named 'key_input', // it is the dedicated power key handler (am_key_input) if (strncmp(m_deviceName, "key_input", strlen("key_input")) == 0) return; // ignore the native aml driver named 'aml_keypad', // it is the dedicated IR remote handler (amremote) else if (strncmp(m_deviceName, "aml_keypad", strlen("aml_keypad")) == 0) return; // turn off any keyboard autorepeat, there is a kernel bug // where if the cpu is max'ed then key up is missed and // we get a flood of EV_REP that never stop until next // key down/up. Very nasty when seeking during video playback. enable = false; } #endif if (enable) { int kbdrep[2] = { 400, 80 }; ioctl(fd, EVIOCSREP, kbdrep); } else { struct input_event event; memset(&event, 0, sizeof(event)); gettimeofday(&event.time, NULL); event.type = EV_REP; event.code = REP_DELAY; event.value = 0; write(fd, &event, sizeof(event)); gettimeofday(&event.time, NULL); event.type = EV_REP; event.code = REP_PERIOD; event.value = 0; write(fd, &event, sizeof(event)); CLog::Log(LOGINFO, "CLinuxInputDevice: auto key repeat disabled on device '%s'\n", m_deviceName); } }
void aml_cpufreq_min(bool limit) { // do not touch scaling_min_freq on android #if !defined(TARGET_ANDROID) // only needed for m1/m3 SoCs if ( aml_get_device_type() != AML_DEVICE_TYPE_UNKNOWN && aml_get_device_type() <= AML_DEVICE_TYPE_M3) { int cpufreq = 300000; if (limit) cpufreq = 600000; SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", cpufreq); } #endif }
void aml_cpufreq_max(bool limit) { if (!aml_wired_present() && aml_get_device_type() == AML_DEVICE_TYPE_M6) { // this is a MX Stick, they cannot substain 1GHz // operation without overheating so limit them to 800MHz. int cpufreq = 1000000; if (limit) cpufreq = 800000; SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", cpufreq); SysfsUtils::SetString("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", "ondemand"); } }
bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) { m_hints = hints; switch(m_hints.codec) { case AV_CODEC_ID_MJPEG: m_pFormatName = "am-mjpeg"; break; case AV_CODEC_ID_MPEG1VIDEO: case AV_CODEC_ID_MPEG2VIDEO: case AV_CODEC_ID_MPEG2VIDEO_XVMC: m_mpeg2_sequence_pts = 0; m_mpeg2_sequence = new mpeg2_sequence; m_mpeg2_sequence->width = m_hints.width; m_mpeg2_sequence->height = m_hints.height; m_mpeg2_sequence->ratio = m_hints.aspect; if (m_hints.rfpsrate > 0 && m_hints.rfpsscale != 0) m_mpeg2_sequence->rate = (float)m_hints.rfpsrate / m_hints.rfpsscale; else if (m_hints.fpsrate > 0 && m_hints.fpsscale != 0) m_mpeg2_sequence->rate = (float)m_hints.fpsrate / m_hints.fpsscale; else m_mpeg2_sequence->rate = 1.0; m_pFormatName = "am-mpeg2"; break; case AV_CODEC_ID_H264: if ((aml_get_device_type() != AML_DEVICE_TYPE_M8 && aml_get_device_type() != AML_DEVICE_TYPE_M8M2) && ((m_hints.width > 1920) || (m_hints.height > 1088))) { // 4K is supported only on Amlogic S802/S812 chip return false; } m_pFormatName = "am-h264"; // convert h264-avcC to h264-annex-b as h264-avcC // under streamers can have issues when seeking. if (m_hints.extradata && *(uint8_t*)m_hints.extradata == 1) { m_bitstream = new CBitstreamConverter; m_bitstream->Open(m_hints.codec, (uint8_t*)m_hints.extradata, m_hints.extrasize, true); // make sure we do not leak the existing m_hints.extradata free(m_hints.extradata); m_hints.extrasize = m_bitstream->GetExtraSize(); m_hints.extradata = malloc(m_hints.extrasize); memcpy(m_hints.extradata, m_bitstream->GetExtraData(), m_hints.extrasize); } //m_bitparser = new CBitstreamParser(); //m_bitparser->Open(); break; case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: m_pFormatName = "am-mpeg4"; break; case AV_CODEC_ID_H263: case AV_CODEC_ID_H263P: case AV_CODEC_ID_H263I: // amcodec can't handle h263 return false; break; case AV_CODEC_ID_FLV1: m_pFormatName = "am-flv1"; break; case AV_CODEC_ID_RV10: case AV_CODEC_ID_RV20: case AV_CODEC_ID_RV30: case AV_CODEC_ID_RV40: // m_pFormatName = "am-rv"; // rmvb is not handled well by amcodec return false; break; case AV_CODEC_ID_VC1: m_pFormatName = "am-vc1"; break; case AV_CODEC_ID_WMV3: m_pFormatName = "am-wmv3"; break; case AV_CODEC_ID_AVS: case AV_CODEC_ID_CAVS: m_pFormatName = "am-avs"; break; case AV_CODEC_ID_HEVC: if ((aml_get_device_type() == AML_DEVICE_TYPE_M8B) || (aml_get_device_type() == AML_DEVICE_TYPE_M8M2)) { if ((aml_get_device_type() == AML_DEVICE_TYPE_M8B) && ((m_hints.width > 1920) || (m_hints.height > 1088))) { // 4K HEVC is supported only on Amlogic S812 chip return false; } } else { // HEVC supported only on S805 and S812. return false; } m_pFormatName = "am-h265"; m_bitstream = new CBitstreamConverter(); m_bitstream->Open(m_hints.codec, (uint8_t*)m_hints.extradata, m_hints.extrasize, true); // make sure we do not leak the existing m_hints.extradata free(m_hints.extradata); m_hints.extrasize = m_bitstream->GetExtraSize(); m_hints.extradata = malloc(m_hints.extrasize); memcpy(m_hints.extradata, m_bitstream->GetExtraData(), m_hints.extrasize); break; default: CLog::Log(LOGDEBUG, "%s: Unknown hints.codec(%d", __MODULE_NAME__, m_hints.codec); return false; break; } m_aspect_ratio = m_hints.aspect; m_Codec = new CAMLCodec(); if (!m_Codec) { CLog::Log(LOGERROR, "%s: Failed to create Amlogic Codec", __MODULE_NAME__); return false; } m_opened = false; // allocate a dummy DVDVideoPicture buffer. // first make sure all properties are reset. memset(&m_videobuffer, 0, sizeof(DVDVideoPicture)); m_videobuffer.dts = DVD_NOPTS_VALUE; m_videobuffer.pts = DVD_NOPTS_VALUE; m_videobuffer.format = RENDER_FMT_BYPASS; m_videobuffer.color_range = 0; m_videobuffer.color_matrix = 4; m_videobuffer.iFlags = DVP_FLAG_ALLOCATED; m_videobuffer.iWidth = m_hints.width; m_videobuffer.iHeight = m_hints.height; m_videobuffer.iDisplayWidth = m_videobuffer.iWidth; m_videobuffer.iDisplayHeight = m_videobuffer.iHeight; if (m_hints.aspect > 0.0 && !m_hints.forced_aspect) { m_videobuffer.iDisplayWidth = ((int)lrint(m_videobuffer.iHeight * m_hints.aspect)) & -3; if (m_videobuffer.iDisplayWidth > m_videobuffer.iWidth) { m_videobuffer.iDisplayWidth = m_videobuffer.iWidth; m_videobuffer.iDisplayHeight = ((int)lrint(m_videobuffer.iWidth / m_hints.aspect)) & -3; } } CLog::Log(LOGINFO, "%s: Opened Amlogic Codec", __MODULE_NAME__); return true; }