Changeset 96285 in vbox for trunk/src/VBox/Main
- Timestamp:
- Aug 18, 2022 8:01:23 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 153099
- Location:
- trunk/src/VBox/Main
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/Makefile.kmk
r96212 r96285 1022 1022 # Needed in VBoxSVC for ISystemProperties. 1023 1023 src-server/SystemPropertiesImpl.cpp_DEFS += VBOX_WITH_AUDIO_RECORDING 1024 ifdef VBOX_WITH_LIBOPUS1025 VBoxC_SDKS += VBOX_OPUS1026 VBoxC_DEFS += VBOX_WITH_LIBOPUS1027 # Needed in VBoxSVC for ISystemProperties.1028 src-server/SystemPropertiesImpl.cpp_DEFS += VBOX_WITH_LIBOPUS1029 endif1030 1024 ifdef VBOX_WITH_LIBOGG 1031 1025 VBOX_MAIN_DEFS += VBOX_WITH_LIBOGG … … 1258 1252 VBoxClient-x86_PCH_HDR := $(PATH_SUB_CURRENT)/src-client/win/precomp_vcc.h 1259 1253 endif 1260 VBoxClient-x86_SDKS = $(filter-out VBOX_ OPUS VBOX_VPX,$(VBoxC_SDKS))1254 VBoxClient-x86_SDKS = $(filter-out VBOX_VPX,$(VBoxC_SDKS)) 1261 1255 VBoxClient-x86_DEFS = VBOX_COM_INPROC_API_CLIENT \ 1262 1256 $(filter-out VBOX_WITH_RECORDING VBOX_WITH_AUDIO_RECORDING \ 1263 VBOX_WITH_LIBVPX VBOX_WITH_LIBOPUS,$(VBoxC_DEFS))1257 VBOX_WITH_LIBVPX,$(VBoxC_DEFS)) 1264 1258 VBoxClient-x86_INCS.win = \ 1265 1259 $(VBoxClient-x86_0_OUTDIR) \ -
trunk/src/VBox/Main/include/RecordingInternals.h
r96284 r96285 39 39 #endif /* VBOX_WITH_LIBVPX */ 40 40 41 #ifdef VBOX_WITH_LIBOPUS42 # include <opus.h>43 #endif44 45 41 #ifdef VBOX_WITH_LIBVORBIS 46 42 # include "vorbis/vorbisenc.h" … … 51 47 * Defines * 52 48 *********************************************************************************************************************************/ 53 #define VBOX_RECORDING_OPUS_HZ_MAX 48000 /**< Maximum sample rate (in Hz) Opus can handle. */54 #define VBOX_RECORDING_OPUS_FRAME_MS_DEFAULT 20 /**< Default Opus frame size (in ms). */55 56 49 #define VBOX_RECORDING_VORBIS_HZ_MAX 48000 /**< Maximum sample rate (in Hz) Vorbis can handle. */ 57 50 #define VBOX_RECORDING_VORBIS_FRAME_MS_DEFAULT 20 /**< Default Vorbis frame size (in ms). */ … … 206 199 /** Time (in ms) the encoder expects us to send data to encode. 207 200 * 208 * For Opus, valid frame sizes are:209 * ms Frame size210 * 2.5 120211 * 5 240212 * 10 480213 * 20 (Default) 960214 * 40 1920215 * 60 2880216 *217 201 * For Vorbis, valid frame sizes are powers of two from 64 to 8192 bytes. 218 202 */ … … 247 231 #endif /* VBOX_WITH_LIBVPX */ 248 232 249 #ifdef VBOX_WITH_LIBOPUS250 /**251 * Opus encoder state (needs libvorbis).252 */253 typedef struct RECORDINGCODECOPUS254 {255 /** Encoder we're going to use. */256 OpusEncoder *pEnc;257 } RECORDINGCODECOPUS;258 /** Pointer to an Opus encoder state. */259 typedef RECORDINGCODECOPUS *PRECORDINGCODECOPUS;260 #endif /* VBOX_WITH_LIBOPUS */261 262 233 #ifdef VBOX_WITH_LIBVORBIS 263 234 /** … … 314 285 union 315 286 { 316 # ifdef VBOX_WITH_LIBOPUS317 RECORDINGCODECOPUS Opus;318 # endif /* VBOX_WITH_LIBOPUS */319 287 # ifdef VBOX_WITH_LIBVORBIS 320 288 RECORDINGCODECVORBIS Vorbis; … … 488 456 uint32_t recordingCodecGetWritable(PRECORDINGCODEC pCodec, uint64_t msTimestamp); 489 457 #endif /* !MAIN_INCLUDED_RecordingInternals_h */ 490 -
trunk/src/VBox/Main/include/WebMWriter.h
r96230 r96285 65 65 * With signed 16-bit timecodes and a default timecode scale of 1ms per unit this makes 65536ms. */ 66 66 #define VBOX_WEBM_BLOCK_MAX_LEN_MS UINT16_MAX 67 68 #ifdef VBOX_WITH_LIBOPUS69 # pragma pack(push)70 # pragma pack(1)71 /** Opus codec private data within the MKV (WEBM) container.72 * Taken from: https://wiki.xiph.org/MatroskaOpus */73 typedef struct WEBMOPUSPRIVDATA74 {75 WEBMOPUSPRIVDATA(uint32_t a_u32SampleRate, uint8_t a_u8Channels)76 {77 au64Head = RT_MAKE_U64_FROM_U8('O', 'p', 'u', 's', 'H', 'e', 'a', 'd');78 u8Version = 1;79 u8Channels = a_u8Channels;80 u16PreSkip = 0;81 u32SampleRate = a_u32SampleRate;82 u16Gain = 0;83 u8MappingFamily = 0;84 }85 86 uint64_t au64Head; /**< Defaults to "OpusHead". */87 uint8_t u8Version; /**< Must be set to 1. */88 uint8_t u8Channels;89 uint16_t u16PreSkip;90 /** Sample rate *before* encoding to Opus.91 * Note: This rate has nothing to do with the playback rate later! */92 uint32_t u32SampleRate;93 uint16_t u16Gain;94 /** Must stay 0 -- otherwise a mapping table must be appended95 * right after this header. */96 uint8_t u8MappingFamily;97 } WEBMOPUSPRIVDATA, *PWEBMOPUSPRIVDATA;98 AssertCompileSize(WEBMOPUSPRIVDATA, 19);99 # pragma pack(pop)100 #endif /* VBOX_WITH_LIBOPUS */101 67 102 68 #ifdef VBOX_WITH_LIBVORBIS -
trunk/src/VBox/Main/src-client/DrvAudioRec.cpp
r96284 r96285 26 26 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the 27 27 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 28 */29 30 /* This code makes use of the Vorbis (libvorbis) and Opus codec (libopus):31 *32 * Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,33 * Jean-Marc Valin, Timothy B. Terriberry,34 * CSIRO, Gregory Maxwell, Mark Borgerding,35 * Erik de Castro Lopo36 *37 * Redistribution and use in source and binary forms, with or without38 * modification, are permitted provided that the following conditions39 * are met:40 *41 * - Redistributions of source code must retain the above copyright42 * notice, this list of conditions and the following disclaimer.43 *44 * - Redistributions in binary form must reproduce the above copyright45 * notice, this list of conditions and the following disclaimer in the46 * documentation and/or other materials provided with the distribution.47 *48 * - Neither the name of Internet Society, IETF or IETF Trust, nor the49 * names of specific contributors, may be used to endorse or promote50 * products derived from this software without specific prior written51 * permission.52 *53 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS54 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT55 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR56 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER57 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,58 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,59 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR60 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF61 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING62 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS63 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.64 *65 * Opus is subject to the royalty-free patent licenses which are66 * specified at:67 *68 * Xiph.Org Foundation:69 * https://datatracker.ietf.org/ipr/1524/70 *71 * Microsoft Corporation:72 * https://datatracker.ietf.org/ipr/1914/73 *74 * Broadcom Corporation:75 * https://datatracker.ietf.org/ipr/1526/76 *77 28 */ 78 29 … … 1011 962 PDM_DRVREG_VERSION 1012 963 }; 1013 -
trunk/src/VBox/Main/src-client/RecordingCodec.cpp
r96284 r96285 14 14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the 15 15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 16 */ 17 18 /* This code makes use of the Vorbis (libvorbis): 19 * 20 * Copyright (c) 2002-2020 Xiph.org Foundation 21 * 22 * Redistribution and use in source and binary forms, with or without 23 * modification, are permitted provided that the following conditions 24 * are met: 25 * 26 * - Redistributions of source code must retain the above copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 29 * - Redistributions in binary form must reproduce the above copyright 30 * notice, this list of conditions and the following disclaimer in the 31 * documentation and/or other materials provided with the distribution. 32 * 33 * - Neither the name of the Xiph.org Foundation nor the names of its 34 * contributors may be used to endorse or promote products derived from 35 * this software without specific prior written permission. 36 * 37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 38 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 39 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 40 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION 41 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 44 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 45 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 46 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 47 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 16 48 */ 17 49 … … 212 244 } 213 245 #endif /* VBOX_WITH_LIBVPX */ 214 215 216 /*********************************************************************************************************************************217 * Opus codec *218 *********************************************************************************************************************************/219 220 #ifdef VBOX_WITH_LIBOPUS221 /** @copydoc RECORDINGCODECOPS::pfnInit */222 static DECLCALLBACK(int) recordingCodecOpusInit(PRECORDINGCODEC pCodec)223 {224 pCodec->cbScratch = _4K;225 pCodec->pvScratch = RTMemAlloc(pCodec->cbScratch);226 AssertPtrReturn(pCodec->pvScratch, VERR_NO_MEMORY);227 228 const PPDMAUDIOPCMPROPS pProps = &pCodec->Parms.Audio.PCMProps;229 230 uint32_t uHz = PDMAudioPropsHz(pProps);231 uint8_t const cChannels = PDMAudioPropsChannels(pProps);232 233 /* Opus only supports certain input sample rates in an efficient manner.234 * So make sure that we use those by resampling the data to the requested rate. */235 if (uHz > 24000) uHz = VBOX_RECORDING_OPUS_HZ_MAX;236 else if (uHz > 16000) uHz = 24000;237 else if (uHz > 12000) uHz = 16000;238 else if (uHz > 8000 ) uHz = 12000;239 else uHz = 8000;240 241 int opus_rc;242 OpusEncoder *pEnc = opus_encoder_create(uHz, cChannels, OPUS_APPLICATION_AUDIO, &opus_rc);243 if (opus_rc != OPUS_OK)244 {245 LogRel(("Recording: Audio codec failed to initialize: %s\n", opus_strerror(opus_rc)));246 return VERR_RECORDING_CODEC_INIT_FAILED;247 }248 249 AssertPtr(pEnc);250 251 if (pCodec->Parms.uBitrate) /* Only explicitly set the bitrate management if we specified one. Otherwise let Opus decide. */252 {253 opus_encoder_ctl(pEnc, OPUS_SET_BITRATE(pCodec->Parms.uBitrate));254 if (opus_rc != OPUS_OK)255 {256 opus_encoder_destroy(pEnc);257 pEnc = NULL;258 259 LogRel(("Recording: Audio codec failed to set bitrate (%RU32): %s\n", pCodec->Parms.uBitrate, opus_strerror(opus_rc)));260 return VERR_RECORDING_CODEC_INIT_FAILED;261 }262 }263 264 opus_rc = opus_encoder_ctl(pEnc, OPUS_SET_VBR(pCodec->Parms.uBitrate == 0 ? 1 : 0));265 if (opus_rc != OPUS_OK)266 {267 LogRel(("Recording: Audio codec failed to %s VBR mode: %s\n",268 pCodec->Parms.uBitrate == 0 ? "disable" : "enable", opus_strerror(opus_rc)));269 return VERR_RECORDING_CODEC_INIT_FAILED;270 }271 272 pCodec->Audio.Opus.pEnc = pEnc;273 274 PDMAudioPropsInit(pProps,275 PDMAudioPropsSampleSize(pProps), PDMAudioPropsIsSigned(pProps), PDMAudioPropsChannels(pProps), uHz);276 277 if (!pCodec->Parms.msFrame) /* No ms per frame defined? Use default. */278 pCodec->Parms.msFrame = VBOX_RECORDING_OPUS_FRAME_MS_DEFAULT;279 280 return VINF_SUCCESS;281 }282 283 /** @copydoc RECORDINGCODECOPS::pfnDestroy */284 static DECLCALLBACK(int) recordingCodecOpusDestroy(PRECORDINGCODEC pCodec)285 {286 PRECORDINGCODECOPUS pOpus = &pCodec->Audio.Opus;287 288 if (pOpus->pEnc)289 {290 opus_encoder_destroy(pOpus->pEnc);291 pOpus->pEnc = NULL;292 }293 294 return VINF_SUCCESS;295 }296 297 /** @copydoc RECORDINGCODECOPS::pfnEncode */298 static DECLCALLBACK(int) recordingCodecOpusEncode(PRECORDINGCODEC pCodec,299 const PRECORDINGFRAME pFrame, size_t *pcEncoded, size_t *pcbEncoded)300 {301 const PPDMAUDIOPCMPROPS pPCMProps = &pCodec->Parms.Audio.PCMProps;302 303 Assert (pCodec->Parms.cbFrame);304 AssertReturn (pFrame->Audio.cbBuf % pCodec->Parms.cbFrame == 0, VERR_INVALID_PARAMETER);305 Assert (pFrame->Audio.cbBuf);306 AssertReturn (pFrame->Audio.cbBuf % pPCMProps->cbFrame == 0, VERR_INVALID_PARAMETER);307 AssertReturn(pCodec->cbScratch >= pFrame->Audio.cbBuf, VERR_INVALID_PARAMETER);308 AssertPtrReturn(pcEncoded, VERR_INVALID_POINTER);309 AssertPtrReturn(pcbEncoded, VERR_INVALID_POINTER);310 311 int vrc = VINF_SUCCESS;312 313 size_t cBlocksEncoded = 0;314 size_t cBytesEncoded = 0;315 316 /*317 * Opus always encodes PER "OPUS FRAME", that is, exactly 2.5, 5, 10, 20, 40 or 60 ms of audio data.318 *319 * A packet can have up to 120ms worth of audio data.320 * Anything > 120ms of data will result in a "corrupted package" error message by321 * by decoding application.322 */323 opus_int32 cbWritten = opus_encode(pCodec->Audio.Opus.pEnc,324 (opus_int16 *)pFrame->Audio.pvBuf, (int)(pFrame->Audio.cbBuf / pPCMProps->cbFrame /* Number of audio frames */),325 (uint8_t *)pCodec->pvScratch, (opus_int32)pCodec->cbScratch);326 if (cbWritten < 0)327 {328 LogRel(("Recording: opus_encode() failed (%s)\n", opus_strerror(cbWritten)));329 return VERR_RECORDING_ENCODING_FAILED;330 }331 332 if (cbWritten)333 {334 vrc = pCodec->Callbacks.pfnWriteData(pCodec, pCodec->pvScratch, (size_t)cbWritten, pCodec->State.tsLastWrittenMs,335 RECORDINGCODEC_ENC_F_BLOCK_IS_KEY /* Every Opus frame is a key frame */,336 pCodec->Callbacks.pvUser);337 }338 339 if (RT_SUCCESS(vrc))340 {341 /* Get overall frames encoded. */342 cBlocksEncoded = opus_packet_get_nb_frames((uint8_t *)pCodec->pvScratch, cbWritten);343 cBytesEncoded = cbWritten;344 345 if (pcEncoded)346 *pcEncoded = cBlocksEncoded;347 if (pcbEncoded)348 *pcbEncoded = cBytesEncoded;349 }350 351 if (RT_FAILURE(vrc))352 LogRel(("Recording: Encoding Opus data failed, rc=%Rrc\n", vrc));353 354 Log3Func(("cbSrc=%zu, cbDst=%zu, cEncoded=%zu, cbEncoded=%zu, vrc=%Rrc\n",355 pFrame->Audio.cbBuf, pCodec->cbScratch, cBlocksEncoded, cBytesEncoded, vrc));356 357 return vrc;358 }359 #endif /* VBOX_WITH_LIBOPUS */360 246 361 247 … … 762 648 switch (enmAudioCodec) 763 649 { 764 # ifdef VBOX_WITH_LIBOPUS765 case RecordingAudioCodec_Opus:766 {767 pCodec->Ops.pfnInit = recordingCodecOpusInit;768 pCodec->Ops.pfnDestroy = recordingCodecOpusDestroy;769 pCodec->Ops.pfnParseOptions = recordingCodecAudioParseOptions;770 pCodec->Ops.pfnEncode = recordingCodecOpusEncode;771 772 vrc = VINF_SUCCESS;773 break;774 }775 # endif /* VBOX_WITH_LIBOPUS */776 777 650 # ifdef VBOX_WITH_LIBVORBIS 778 651 case RecordingAudioCodec_OggVorbis: … … 999 872 return pCodec->Parms.cbFrame; 1000 873 } 1001 -
trunk/src/VBox/Main/src-client/WebMWriter.cpp
r96231 r96285 162 162 int WebMWriter::AddAudioTrack(PRECORDINGCODEC pCodec, uint16_t uHz, uint8_t cChannels, uint8_t cBits, uint8_t *puTrack) 163 163 { 164 #if defined(VBOX_WITH_LIB OPUS) || defined(VBOX_WITH_LIBVORBIS)164 #if defined(VBOX_WITH_LIBVORBIS) 165 165 AssertReturn(uHz, VERR_INVALID_PARAMETER); 166 166 AssertReturn(cBits, VERR_INVALID_PARAMETER); … … 196 196 switch (m_enmAudioCodec) 197 197 { 198 # ifdef VBOX_WITH_LIBOPUS199 case RecordingAudioCodec_Opus:200 {201 /*202 * Adjust the handed-in Hz rate to values which are supported by the Opus codec.203 *204 * Only the following values are supported by an Opus standard build205 * -- every other rate only is supported by a custom build.206 *207 * See opus_encoder_create() for more information.208 */209 if (uHz > 24000) uHz = VBOX_RECORDING_OPUS_HZ_MAX;210 else if (uHz > 16000) uHz = 24000;211 else if (uHz > 12000) uHz = 16000;212 else if (uHz > 8000 ) uHz = 12000;213 else uHz = 8000;214 215 WEBMOPUSPRIVDATA opusPrivData(uHz, cChannels);216 217 pTrack->Audio.msPerBlock = 0; /** @todo */218 if (!pTrack->Audio.msPerBlock) /* No ms per frame defined? Use default. */219 pTrack->Audio.msPerBlock = VBOX_RECORDING_OPUS_FRAME_MS_DEFAULT;220 221 serializeString(MkvElem_CodecID, "A_OPUS");222 serializeData(MkvElem_CodecPrivate, &opusPrivData, sizeof(opusPrivData));223 break;224 }225 # endif /* VBOX_WITH_LIBOPUS */226 198 # ifdef VBOX_WITH_LIBVORBIS 227 199 case RecordingAudioCodec_OggVorbis: … … 326 298 delete pTrack; 327 299 return vrc; 328 #else /* defined(VBOX_WITH_LIBOPUS) ||defined(VBOX_WITH_LIBVORBIS) */300 #else /* !defined(VBOX_WITH_LIBVORBIS) */ 329 301 RT_NOREF(pCodec, uHz, cChannels, cBits, puTrack); 330 302 return VERR_NOT_SUPPORTED; … … 425 397 int WebMWriter::init(RecordingAudioCodec_T enmAudioCodec, RecordingVideoCodec_T enmVideoCodec) 426 398 { 427 #ifndef VBOX_WITH_LIBOPUS428 AssertReturn(enmAudioCodec != RecordingAudioCodec_Opus, VERR_NOT_SUPPORTED);429 #endif430 399 #ifndef VBOX_WITH_LIBVORBIS 431 400 AssertReturn(enmAudioCodec != RecordingAudioCodec_OggVorbis, VERR_NOT_SUPPORTED); … … 934 903 .subEnd(MkvElem_Info); 935 904 } 936 -
trunk/src/VBox/Main/src-server/RecordingScreenSettingsImpl.cpp
r96175 r96285 583 583 return setError(E_INVALIDARG, tr("Cannot change audio codec while recording is enabled")); 584 584 585 if (aCodec != RecordingAudioCodec_O pus)585 if (aCodec != RecordingAudioCodec_OggVorbis) 586 586 return setError(E_INVALIDARG, tr("Audio codec not supported")); 587 587 … … 1232 1232 return ASMAtomicReadS32(&m->cRefs); 1233 1233 } 1234 -
trunk/src/VBox/Main/src-server/SystemPropertiesImpl.cpp
r96143 r96285 1602 1602 RecordingAudioCodec_WavPCM, 1603 1603 #endif 1604 #ifdef VBOX_WITH_LIBOPUS1605 RecordingAudioCodec_Opus,1606 #endif1607 1604 #ifdef VBOX_WITH_LIBVORBIS 1608 1605 RecordingAudioCodec_OggVorbis, … … 2398 2395 #endif 2399 2396 } 2400 -
trunk/src/VBox/Main/xml/Settings.cpp
r96175 r96285 3026 3026 Video.ulFPS = 25; 3027 3027 #ifdef VBOX_WITH_AUDIO_RECORDING 3028 /* When both codecs are defined, prefer Ogg Vorbis as a default. */3029 3028 # if defined(VBOX_WITH_LIBVORBIS) 3030 3029 Audio.enmCodec = RecordingAudioCodec_OggVorbis; 3031 # elif defined(VBOX_WITH_LIBOPUS)3032 Audio.enmCodec = RecordingAudioCodec_Opus;3033 3030 # else 3034 3031 Audio.enmCodec = RecordingAudioCodec_None; … … 3073 3070 && Video.ulFPS == 25 3074 3071 #ifdef VBOX_WITH_AUDIO_RECORDING 3075 /* When both codecs are defined, prefer Ogg Vorbis as a default. */3076 3072 # if defined(VBOX_WITH_LIBVORBIS) 3077 3073 && Audio.enmCodec == RecordingAudioCodec_OggVorbis 3078 # elif defined(VBOX_WITH_LIBOPUS)3079 && Audio.enmCodec == RecordingAudioCodec_Opus3080 3074 # else 3081 3075 && Audio.enmCodec == RecordingAudioCodec_None
Note:
See TracChangeset
for help on using the changeset viewer.