| 42 | } |
| 43 | |
| 44 | void ScreenRecorder::initialize(ScreenRecorder::EncoderMode encMode, EncoderQuality quality) { |
| 45 | setLogTagStatic("screenrec"); |
| 46 | traceScope(); |
| 47 | |
| 48 | SharedInstance<ScreenRecorder>::initialize(); |
| 49 | |
| 50 | av_log_set_callback(avLog); |
| 51 | |
| 52 | m_encMode = encMode; |
| 53 | const char* encName = "unset"; |
| 54 | switch (m_encMode) { |
| 55 | case WEBP: |
| 56 | encName = "libwebp"; |
| 57 | m_quality = WEBP_QUALITY[quality]; |
| 58 | break; |
| 59 | case MJPEG: |
| 60 | encName = "mjpeg"; |
| 61 | m_quality = MJPEG_QUALITY[quality]; |
| 62 | break; |
| 63 | } |
| 64 | m_outputCodec = avcodec_find_encoder_by_name(encName); |
| 65 | if (nullptr == m_outputCodec) { |
| 66 | logln("unable to find output codec " << encName); |
| 67 | return; |
| 68 | } |
| 69 | |
| 70 | #ifdef JUCE_MAC |
| 71 | m_downScale = quality != ENC_QUALITY_HIGH; |
| 72 | #endif |
| 73 | |
| 74 | if (m_initialized) { |
| 75 | return; |
| 76 | } |
| 77 | |
| 78 | if (auto disp = Desktop::getInstance().getDisplays().getPrimaryDisplay()) { |
| 79 | m_scale = disp->scale; |
| 80 | } else { |
| 81 | m_scale = 1.0; |
| 82 | } |
| 83 | |
| 84 | avdevice_register_all(); |
| 85 | |
| 86 | #ifdef JUCE_MAC |
| 87 | askForScreenRecordingPermission(); |
| 88 | m_inputFmtName = "avfoundation"; |
| 89 | m_inputStreamUrl = String(getCaptureDeviceIndex()) + ":none"; |
| 90 | #elif defined JUCE_LINUX |
| 91 | m_inputFmtName = "x11grab"; |
| 92 | m_inputStreamUrl = ":0.0"; |
| 93 | #else |
| 94 | m_inputFmtName = "gdigrab"; |
| 95 | m_inputStreamUrl = "desktop"; |
| 96 | #endif |
| 97 | |
| 98 | logln("using device " << m_inputFmtName << " with stream URL '" << m_inputStreamUrl << "'"); |
| 99 | |
| 100 | m_inputFmt = av_find_input_format(m_inputFmtName.getCharPointer()); |
| 101 | if (nullptr == m_inputFmt) { |
nothing calls this directly
no test coverage detected