New upstream version 21.0.2+dfsg1
This commit is contained in:
parent
1f1bbb3518
commit
baafb6325b
706 changed files with 49633 additions and 5044 deletions
|
|
@ -1,3 +1,8 @@
|
|||
option(DISABLE_PLUGINS "Disable building of OBS plugins" OFF)
|
||||
if(DISABLE_PLUGINS)
|
||||
message(STATUS "DISABLE_PLUGINS is set; building of plugins is disabled.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
option(BUILD_CA_ENCODER "Build CoreAudio encoder module" ON)
|
||||
|
|
@ -11,13 +16,10 @@ if(WIN32)
|
|||
add_subdirectory(win-mf)
|
||||
add_subdirectory(obs-qsv11)
|
||||
add_subdirectory(vlc-video)
|
||||
option(BUILD_AMF_ENCODER "Build AMD Advanced Media Framework encoder module" OFF)
|
||||
if (BUILD_AMF_ENCODER)
|
||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/enc-amf/CMakeLists.txt")
|
||||
add_subdirectory(enc-amf)
|
||||
else()
|
||||
message(STATUS "enc-amf submodule not found! Please fetch submodules. enc-amf plugin disabled.")
|
||||
endif()
|
||||
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/enc-amf/CMakeLists.txt")
|
||||
add_subdirectory(enc-amf)
|
||||
else()
|
||||
message(STATUS "enc-amf submodule not found! Please fetch submodules. enc-amf plugin disabled.")
|
||||
endif()
|
||||
if (MSVC)
|
||||
add_subdirectory(win-ivcam)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
CoreAudioAAC="Κωδικοποιητής AAC CoreAudio"
|
||||
Bitrate="Ρυθμός μετάδοσης bit"
|
||||
AllowHEAAC="Να Επιτρέπεται το HE-AAC"
|
||||
OutputSamplerate="Ρυθμός Δειγματολειψίας Εξόδου"
|
||||
UseInputSampleRate="Χρήση Ρυθμού Δειγματολειψίας Εισόδου (OBS) (μπορεί να περιλαμβάνει μη υποστηριζόμενα bitrates)"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
CoreAudioAAC="CoreAudio AAC enkodér"
|
||||
Bitrate="Dátový tok"
|
||||
AllowHEAAC="Povoliť HE-AAC"
|
||||
OutputSamplerate="Vzorkovacia frekvencia výstupu"
|
||||
UseInputSampleRate="Použiť vstupnú (OBS) vzorkovaciu frekvenciu (môže obsahovať nepodporované dátové toky)"
|
||||
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@ CoreAudioAAC="CoreAudio AAC енкодер"
|
|||
Bitrate="Бітрейт"
|
||||
AllowHEAAC="Дозволити HE-AAC"
|
||||
OutputSamplerate="Частота дискретизації виводу"
|
||||
UseInputSampleRate="Використати частоту дискретизації вводу (OBS) (може відображатися непідтримуваний бітрейт)"
|
||||
UseInputSampleRate="Використати частоту дискретизації вводу (до OBS) (може показувати непідтримуваний бітрейт)"
|
||||
|
||||
|
|
|
|||
4
plugins/coreaudio-encoder/data/locale/vi-VN.ini
Normal file
4
plugins/coreaudio-encoder/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
CoreAudioAAC="Bộ mã hóa CoreAudio AAC"
|
||||
Bitrate="Bitrate"
|
||||
AllowHEAAC="Cho phép HE-AAC"
|
||||
|
||||
|
|
@ -546,7 +546,7 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
|
|||
|
||||
UInt32 rate_control = kAudioCodecBitRateControlMode_Constant;
|
||||
|
||||
if (obs_data_get_bool(settings, "allow he-aac")) {
|
||||
if (obs_data_get_bool(settings, "allow he-aac") && ca->channels != 3) {
|
||||
ca->allowed_formats = &aac_formats;
|
||||
} else {
|
||||
ca->allowed_formats = &aac_lc_formats;
|
||||
|
|
@ -601,6 +601,35 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder)
|
|||
kAudioConverterCurrentOutputStreamDescription,
|
||||
&size, &out));
|
||||
|
||||
/*
|
||||
* Fix channel map differences between CoreAudio AAC, FFmpeg, Wav
|
||||
* New channel mappings below assume 2.1, 4.1, 5.1, 7.1 resp.
|
||||
*/
|
||||
if (ca->channels == 3) {
|
||||
SInt32 channelMap3[3] = {2, 0, 1};
|
||||
AudioConverterSetProperty(ca->converter,
|
||||
kAudioConverterChannelMap,
|
||||
sizeof(channelMap3), channelMap3);
|
||||
|
||||
} else if (ca->channels == 5) {
|
||||
SInt32 channelMap5[5] = {2, 0, 1, 3, 4};
|
||||
AudioConverterSetProperty(ca->converter,
|
||||
kAudioConverterChannelMap,
|
||||
sizeof(channelMap5), channelMap5);
|
||||
|
||||
} else if (ca->channels == 6) {
|
||||
SInt32 channelMap6[6] = {2, 0, 1, 4, 5, 3};
|
||||
AudioConverterSetProperty(ca->converter,
|
||||
kAudioConverterChannelMap,
|
||||
sizeof(channelMap6), channelMap6);
|
||||
|
||||
} else if (ca->channels == 8) {
|
||||
SInt32 channelMap8[8] = {2, 0, 1, 6, 7, 4, 5, 3};
|
||||
AudioConverterSetProperty(ca->converter,
|
||||
kAudioConverterChannelMap,
|
||||
sizeof(channelMap8), channelMap8);
|
||||
}
|
||||
|
||||
ca->in_frame_size = in.mBytesPerFrame;
|
||||
ca->in_packets = out.mFramesPerPacket / in.mFramesPerPacket;
|
||||
ca->in_bytes_required = ca->in_packets * ca->in_frame_size;
|
||||
|
|
@ -877,10 +906,9 @@ static bool aac_extra_data(void *data, uint8_t **extra_data, size_t *size)
|
|||
}
|
||||
|
||||
static asbd_builder fill_common_asbd_fields(asbd_builder builder,
|
||||
bool in=false)
|
||||
bool in=false, UInt32 channels=2)
|
||||
{
|
||||
UInt32 bytes_per_frame = 8;
|
||||
UInt32 channels = 2;
|
||||
UInt32 bytes_per_frame = sizeof(float) * channels;
|
||||
UInt32 bits_per_channel = bytes_per_frame / channels * 8;
|
||||
|
||||
builder.channels_per_frame(channels);
|
||||
|
|
@ -908,9 +936,9 @@ static AudioStreamBasicDescription get_default_in_asbd()
|
|||
.asbd;
|
||||
}
|
||||
|
||||
static asbd_builder get_default_out_asbd_builder()
|
||||
static asbd_builder get_default_out_asbd_builder(UInt32 channels)
|
||||
{
|
||||
return fill_common_asbd_fields(asbd_builder())
|
||||
return fill_common_asbd_fields(asbd_builder(), false, channels)
|
||||
.sample_rate(44100);
|
||||
}
|
||||
|
||||
|
|
@ -975,7 +1003,7 @@ static bool find_best_match(DStr &log, ca_encoder *ca, UInt32 bitrate,
|
|||
log_to_dstr(log, ca, "Trying %s (0x%x)\n",
|
||||
format_id_to_str(format_id), format_id);
|
||||
|
||||
auto out = get_default_out_asbd_builder()
|
||||
auto out = get_default_out_asbd_builder(2)
|
||||
.format_id(format_id)
|
||||
.asbd;
|
||||
|
||||
|
|
@ -1206,6 +1234,11 @@ static vector<UInt32> get_bitrates(DStr &log, ca_encoder *ca,
|
|||
Float64 samplerate)
|
||||
{
|
||||
vector<UInt32> bitrates;
|
||||
struct obs_audio_info aoi;
|
||||
int channels;
|
||||
|
||||
obs_get_audio_info(&aoi);
|
||||
channels = get_audio_channels(aoi.speakers);
|
||||
|
||||
auto handle_bitrate = [&](UInt32 bitrate)
|
||||
{
|
||||
|
|
@ -1240,7 +1273,7 @@ static vector<UInt32> get_bitrates(DStr &log, ca_encoder *ca,
|
|||
static_cast<uint32_t>(format_id),
|
||||
samplerate);
|
||||
|
||||
auto out = get_default_out_asbd_builder()
|
||||
auto out = get_default_out_asbd_builder(channels)
|
||||
.format_id(format_id)
|
||||
.sample_rate(samplerate)
|
||||
.asbd;
|
||||
|
|
|
|||
|
|
@ -21,52 +21,64 @@ int check_buffer(struct audio_repack *repack,
|
|||
}
|
||||
|
||||
/*
|
||||
Swap channel between LFE and FC, and
|
||||
squash data array
|
||||
|
||||
| FL | FR |LFE | FC | BL | BR |emp |emp |
|
||||
| | x | |
|
||||
| FL | FR | FC |LFE | BL | BR |
|
||||
* Swap channel 3 & 4, 5 & 7, 6 & 8 and squash arrays
|
||||
* 2.1:
|
||||
*
|
||||
* | FL | FR | LFE | emp | emp | emp |emp |emp |
|
||||
* | | |
|
||||
* | FL | FR | LFE |
|
||||
* 4.0 (quad):
|
||||
*
|
||||
* | FL | FR | BR | BL | emp | emp |emp |emp |
|
||||
* | | x |
|
||||
* | FL | FR | BL | BC |
|
||||
*
|
||||
* 4.1:
|
||||
*
|
||||
* | FL | FR |LFE | FC | BC | emp |emp |emp |
|
||||
* | | x | |
|
||||
* | FL | FR | FC |LFE | BC |
|
||||
*
|
||||
* 5.1:
|
||||
*
|
||||
* | FL | FR |LFE | FC |(emp|emp)|(BL|BR)|
|
||||
* | | x x
|
||||
* | FL | FR | FC |LFE | BL | BR |
|
||||
*
|
||||
* 7.1:
|
||||
*
|
||||
* | FL | FR |LFE | FC |( SL | SR )|(BL |BR )|
|
||||
* | | x X
|
||||
* | FL | FR | FC |LFE |( BL | BR )|(SL |SR )|
|
||||
*/
|
||||
int repack_8to6ch_swap23(struct audio_repack *repack,
|
||||
|
||||
int repack_squash_swap(struct audio_repack *repack,
|
||||
const uint8_t *bsrc, uint32_t frame_count)
|
||||
{
|
||||
if (check_buffer(repack, frame_count) < 0)
|
||||
return -1;
|
||||
|
||||
int squash = repack->extra_dst_size;
|
||||
const __m128i *src = (__m128i *)bsrc;
|
||||
const __m128i *esrc = src + frame_count;
|
||||
uint32_t *dst = (uint32_t *)repack->packet_buffer;
|
||||
while (src != esrc) {
|
||||
__m128i target = _mm_load_si128(src++);
|
||||
__m128i buf = _mm_shufflelo_epi16(target, _MM_SHUFFLE(2, 3, 1, 0));
|
||||
_mm_storeu_si128((__m128i *)dst, buf);
|
||||
dst += 3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Swap channel between LFE and FC
|
||||
|
||||
| FL | FR |LFE | FC | BL | BR |SBL |SBR |
|
||||
| | x | | | |
|
||||
| FL | FR | FC |LFE | BL | BR |SBL |SBR |
|
||||
*/
|
||||
int repack_8ch_swap23(struct audio_repack *repack,
|
||||
const uint8_t *bsrc, uint32_t frame_count)
|
||||
{
|
||||
if (check_buffer(repack, frame_count) < 0)
|
||||
return -1;
|
||||
|
||||
const __m128i *src = (__m128i *)bsrc;
|
||||
const __m128i *esrc = src + frame_count;
|
||||
__m128i *dst = (__m128i *)repack->packet_buffer;
|
||||
while (src != esrc) {
|
||||
__m128i target = _mm_load_si128(src++);
|
||||
__m128i buf = _mm_shufflelo_epi16(target, _MM_SHUFFLE(2, 3, 1, 0));
|
||||
_mm_store_si128(dst++, buf);
|
||||
uint16_t *dst = (uint16_t *)repack->packet_buffer;
|
||||
/* 2.1 audio does not require re-ordering but still needs squashing
|
||||
* in order to avoid sampling issues.
|
||||
*/
|
||||
if (squash == 5) {
|
||||
while (src != esrc) {
|
||||
__m128i target = _mm_load_si128(src++);
|
||||
_mm_storeu_si128((__m128i *)dst, target);
|
||||
dst += 8 - squash;
|
||||
}
|
||||
} else {
|
||||
while (src != esrc) {
|
||||
__m128i target = _mm_load_si128(src++);
|
||||
__m128i buf = _mm_shufflelo_epi16(target, _MM_SHUFFLE(2, 3, 1, 0));
|
||||
__m128i buf2 = _mm_shufflehi_epi16(buf, _MM_SHUFFLE(1, 0, 3, 2));
|
||||
_mm_storeu_si128((__m128i *)dst, buf2);
|
||||
dst += 8 - squash;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -81,18 +93,38 @@ int audio_repack_init(struct audio_repack *repack,
|
|||
return -1;
|
||||
|
||||
switch (repack_mode) {
|
||||
case repack_mode_8to6ch_swap23:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 6 * (16 / 8);
|
||||
repack->extra_dst_size = 2;
|
||||
repack->repack_func = &repack_8to6ch_swap23;
|
||||
case repack_mode_8to3ch_swap23:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 3 * (16 / 8);
|
||||
repack->extra_dst_size = 5;
|
||||
repack->repack_func = &repack_squash_swap;
|
||||
break;
|
||||
case repack_mode_8to4ch_swap23:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 4 * (16 / 8);
|
||||
repack->extra_dst_size = 4;
|
||||
repack->repack_func = &repack_squash_swap;
|
||||
break;
|
||||
|
||||
case repack_mode_8ch_swap23:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 8 * (16 / 8);
|
||||
case repack_mode_8to5ch_swap23:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 5 * (16 / 8);
|
||||
repack->extra_dst_size = 3;
|
||||
repack->repack_func = &repack_squash_swap;
|
||||
break;
|
||||
|
||||
case repack_mode_8to6ch_swap23:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 6 * (16 / 8);
|
||||
repack->extra_dst_size = 2;
|
||||
repack->repack_func = &repack_squash_swap;
|
||||
break;
|
||||
|
||||
case repack_mode_8ch_swap23_swap46_swap57:
|
||||
repack->base_src_size = 8 * (16 / 8);
|
||||
repack->base_dst_size = 8 * (16 / 8);
|
||||
repack->extra_dst_size = 0;
|
||||
repack->repack_func = &repack_8ch_swap23;
|
||||
repack->repack_func = &repack_squash_swap;
|
||||
break;
|
||||
|
||||
default: return -1;
|
||||
|
|
|
|||
|
|
@ -26,8 +26,11 @@ struct audio_repack {
|
|||
};
|
||||
|
||||
enum _audio_repack_mode {
|
||||
repack_mode_8to3ch_swap23,
|
||||
repack_mode_8to4ch_swap23,
|
||||
repack_mode_8to5ch_swap23,
|
||||
repack_mode_8to6ch_swap23,
|
||||
repack_mode_8ch_swap23,
|
||||
repack_mode_8ch_swap23_swap46_swap57,
|
||||
};
|
||||
|
||||
typedef enum _audio_repack_mode audio_repack_mode_t;
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Dispositiu"
|
|||
Mode="Mode"
|
||||
Buffering="Usa memòria intermèdia"
|
||||
PixelFormat="Format de píxel"
|
||||
ColorSpace="Espai de color YUV"
|
||||
ColorSpace.Default="Per defecte"
|
||||
ColorRange="Gamma de color YUV"
|
||||
ColorRange.Default="Per defecte"
|
||||
ColorRange.Partial="Parcial"
|
||||
ColorRange.Full="Complet"
|
||||
ChannelFormat="Canal"
|
||||
ChannelFormat.None="Cap"
|
||||
ChannelFormat.2_0ch="Estèreo "
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (posterior)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
ChannelFormat.2_1ch="Canals 2.1"
|
||||
ChannelFormat.4_0ch="4"
|
||||
ChannelFormat.4_1ch="4.1"
|
||||
ChannelFormat.5_1ch="Canals 5.1"
|
||||
ChannelFormat.7_1ch="Canals 7.1"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Zařízení"
|
|||
Mode="Mód"
|
||||
Buffering="Použít vyrovnávací paměť"
|
||||
PixelFormat="Formát pixelů"
|
||||
ColorSpace="Prostor barev YUV"
|
||||
ColorSpace.Default="Výchozí"
|
||||
ColorRange="Rozsah barev YUV"
|
||||
ColorRange.Default="Výchozí"
|
||||
ColorRange.Partial="Částečný"
|
||||
ColorRange.Full="Plný"
|
||||
ChannelFormat="Kanály"
|
||||
ChannelFormat.None="Žádný"
|
||||
ChannelFormat.2_0ch="Stereo"
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (zadní)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,19 @@ BlackmagicDevice="Blackmagic-enhed"
|
|||
Device="Enhed"
|
||||
Mode="Tilstand"
|
||||
Buffering="Brug buffering"
|
||||
PixelFormat="Pixel format"
|
||||
PixelFormat="Pixelformat"
|
||||
ColorSpace="YUV farverum"
|
||||
ColorSpace.Default="Standard"
|
||||
ColorRange="YUV-farveområde"
|
||||
ColorRange.Default="Standard"
|
||||
ColorRange.Partial="Delvis"
|
||||
ColorRange.Full="Fuld"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Intet"
|
||||
ChannelFormat.2_0ch="2kan"
|
||||
ChannelFormat.5_1ch="5.1kan"
|
||||
ChannelFormat.5_1chBack="5.1kan (bag)"
|
||||
ChannelFormat.7_1ch="7.1kan"
|
||||
ChannelFormat.2_1ch="2.1 kasnals"
|
||||
ChannelFormat.4_0ch="4 kanals"
|
||||
ChannelFormat.4_1ch="4.1 kanals"
|
||||
ChannelFormat.5_1ch="5.1 kanals"
|
||||
ChannelFormat.7_1ch="7.1 kanals"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Gerät"
|
|||
Mode="Modus"
|
||||
Buffering="Buffering benutzen"
|
||||
PixelFormat="Pixelformat"
|
||||
ColorSpace="YUV-Farbmatrix"
|
||||
ColorSpace.Default="Standard"
|
||||
ColorRange="YUV-Farbbereich"
|
||||
ColorRange.Default="Standard"
|
||||
ColorRange.Partial="Begrenzt"
|
||||
ColorRange.Full="Voll"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Keins"
|
||||
ChannelFormat.2_0ch="2 Kanal"
|
||||
ChannelFormat.2_1ch="2.1 Kanal"
|
||||
ChannelFormat.4_0ch="4 Kanal"
|
||||
ChannelFormat.4_1ch="4.1 Kanal"
|
||||
ChannelFormat.5_1ch="5.1 Kanal"
|
||||
ChannelFormat.5_1chBack="5.1 Kanal (hinten)"
|
||||
ChannelFormat.7_1ch="7.1 Kanal"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,13 @@ Device="Συσκευή"
|
|||
Mode="Λειτουργία"
|
||||
Buffering="Χρήση ενδιάμεσης μνήμης"
|
||||
PixelFormat="Μορφή pixel"
|
||||
ColorSpace="Χώρος Χρωμάτων YUV"
|
||||
ColorSpace.Default="Προεπιλογή"
|
||||
ColorRange="Έκταση Χρωμάτων YUV"
|
||||
ColorRange.Default="Προεπιλογή"
|
||||
ColorRange.Partial="Μερική"
|
||||
ColorRange.Full="Πλήρης"
|
||||
ChannelFormat="Κανάλι"
|
||||
ChannelFormat.None="Κανένα"
|
||||
ChannelFormat.2_0ch="2 Καναλιών"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,17 @@ Device="Device"
|
|||
Mode="Mode"
|
||||
Buffering="Use Buffering"
|
||||
PixelFormat="Pixel Format"
|
||||
ColorSpace="YUV Color Space"
|
||||
ColorSpace.Default="Default"
|
||||
ColorRange="YUV Color Range"
|
||||
ColorRange.Default="Default"
|
||||
ColorRange.Partial="Partial"
|
||||
ColorRange.Full="Full"
|
||||
ChannelFormat="Channel"
|
||||
ChannelFormat.None="None"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Back)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Dispositivo"
|
|||
Mode="Modo"
|
||||
Buffering="Utilizar el almacenamiento en búfer"
|
||||
PixelFormat="Formato de píxel"
|
||||
ColorSpace="Espacio de color YUV"
|
||||
ColorSpace.Default="Predeterminado"
|
||||
ColorRange="Rango de color YUV"
|
||||
ColorRange.Default="Predeterminado"
|
||||
ColorRange.Partial="Parcial"
|
||||
ColorRange.Full="Completo"
|
||||
ChannelFormat="Canal"
|
||||
ChannelFormat.None="Ninguno"
|
||||
ChannelFormat.2_0ch="Estéreo "
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (posterior)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
ChannelFormat.2_1ch="2.1 canales"
|
||||
ChannelFormat.4_0ch="4 canales"
|
||||
ChannelFormat.4_1ch="4.1 canales"
|
||||
ChannelFormat.5_1ch="5.1 canales"
|
||||
ChannelFormat.7_1ch="7.1 canales"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Gailua"
|
|||
Mode="Modua"
|
||||
Buffering="Erabili Bufferreratzea"
|
||||
PixelFormat="Pixel formatua"
|
||||
ColorSpace="YUV kolore espazioa"
|
||||
ColorSpace.Default="Lehenetsia"
|
||||
ColorRange="YUV kolore tartea"
|
||||
ColorRange.Default="Lehenetsia"
|
||||
ColorRange.Partial="Partziala"
|
||||
ColorRange.Full="Osoa"
|
||||
ChannelFormat="Kanala"
|
||||
ChannelFormat.None="Ezer ez"
|
||||
ChannelFormat.2_0ch="2k"
|
||||
ChannelFormat.5_1ch="5.1k"
|
||||
ChannelFormat.5_1chBack="5.1k (Atzera)"
|
||||
ChannelFormat.7_1ch="7.1k"
|
||||
ChannelFormat.2_1ch="2.1 kanala"
|
||||
ChannelFormat.4_0ch="4kanala"
|
||||
ChannelFormat.4_1ch="4.1kanala"
|
||||
ChannelFormat.5_1ch="5.1 kanala"
|
||||
ChannelFormat.7_1ch="7.1 kanala"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Laite"
|
|||
Mode="Tila"
|
||||
Buffering="Käytä puskurointia"
|
||||
PixelFormat="Pikselimuoto"
|
||||
ColorSpace="YUV väriavaruus"
|
||||
ColorSpace.Default="Oletusarvo"
|
||||
ColorRange="YUV värialue"
|
||||
ColorRange.Default="Oletusarvo"
|
||||
ColorRange.Partial="Osittainen"
|
||||
ColorRange.Full="Täysi"
|
||||
ChannelFormat="Kanava"
|
||||
ChannelFormat.None="Ei mitään"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Taka)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Périphérique"
|
|||
Mode="Mode"
|
||||
Buffering="Utiliser la mise en mémoire tampon"
|
||||
PixelFormat="Format de pixel"
|
||||
ColorSpace="Espace de couleurs YUV"
|
||||
ColorSpace.Default="Défaut"
|
||||
ColorRange="Gamme de couleurs YUV"
|
||||
ColorRange.Default="Défaut"
|
||||
ColorRange.Partial="Partiel"
|
||||
ColorRange.Full="Complète"
|
||||
ChannelFormat="Canaux audio"
|
||||
ChannelFormat.None="Aucun"
|
||||
ChannelFormat.2_0ch="canal 2"
|
||||
ChannelFormat.5_1ch="canal 5.1"
|
||||
ChannelFormat.5_1chBack="canal (arrière) 5.1"
|
||||
ChannelFormat.7_1ch="canal 7.1"
|
||||
ChannelFormat.2_0ch="2 canaux"
|
||||
ChannelFormat.2_1ch="2.1 canaux"
|
||||
ChannelFormat.4_0ch="4 canaux"
|
||||
ChannelFormat.4_1ch="4.1 canaux"
|
||||
ChannelFormat.5_1ch="5.1 canaux"
|
||||
ChannelFormat.7_1ch="7.1 canaux"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Eszköz"
|
|||
Mode="Mód"
|
||||
Buffering="Pufferelés használata"
|
||||
PixelFormat="Képpont formátum"
|
||||
ColorSpace="YUV színtér"
|
||||
ColorSpace.Default="Alapértelmezett"
|
||||
ColorRange="YUV színtartomány"
|
||||
ColorRange.Default="Alapértelmezett"
|
||||
ColorRange.Partial="Részleges"
|
||||
ColorRange.Full="Teljes"
|
||||
ChannelFormat="Csatorna"
|
||||
ChannelFormat.None="Nincs"
|
||||
ChannelFormat.2_0ch="2cs"
|
||||
ChannelFormat.2_1ch="2.1cs"
|
||||
ChannelFormat.4_0ch="4cs"
|
||||
ChannelFormat.4_1ch="4.1cs"
|
||||
ChannelFormat.5_1ch="5.1cs"
|
||||
ChannelFormat.5_1chBack="5.1cs (Hátsó)"
|
||||
ChannelFormat.7_1ch="7.1cs"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,20 @@
|
|||
BlackmagicDevice="Blackmagic Device"
|
||||
BlackmagicDevice="Dispositivo Blackmagic"
|
||||
Device="Dispositivo"
|
||||
Mode="Modalità"
|
||||
Buffering="Usa buffer"
|
||||
PixelFormat="Formato pixel"
|
||||
ColorSpace="Spazio colore YUV"
|
||||
ColorSpace.Default="Predefinito"
|
||||
ColorRange="Gamma di colore YUV"
|
||||
ColorRange.Default="Predefinito"
|
||||
ColorRange.Partial="Parziale"
|
||||
ColorRange.Full="Intero"
|
||||
ChannelFormat="Canale"
|
||||
ChannelFormat.None="Nessuno"
|
||||
ChannelFormat.2_0ch="2 canali"
|
||||
ChannelFormat.2_1ch="2.1 canali"
|
||||
ChannelFormat.4_0ch="4 canali"
|
||||
ChannelFormat.4_1ch="4.1 canali"
|
||||
ChannelFormat.5_1ch="5.1 canali"
|
||||
ChannelFormat.5_1chBack="5.1 canali (retro)"
|
||||
ChannelFormat.7_1ch="7.1 canali"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="デバイス"
|
|||
Mode="モード"
|
||||
Buffering="バッファリングを使用する"
|
||||
PixelFormat="ピクセルフォーマット"
|
||||
ColorSpace="YUV 色空間"
|
||||
ColorSpace.Default="既定"
|
||||
ColorRange="YUV 色範囲"
|
||||
ColorRange.Default="既定"
|
||||
ColorRange.Partial="一部"
|
||||
ColorRange.Full="全部"
|
||||
ChannelFormat="チャンネル"
|
||||
ChannelFormat.None="未設定"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4 ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (背部)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="장치"
|
|||
Mode="방식"
|
||||
Buffering="버퍼링 사용"
|
||||
PixelFormat="픽셀 형식"
|
||||
ColorSpace="YUV 색 공간"
|
||||
ColorSpace.Default="기본값"
|
||||
ColorRange="YUV 색상 범위"
|
||||
ColorRange.Default="기본값"
|
||||
ColorRange.Partial="부분"
|
||||
ColorRange.Full="전체"
|
||||
ChannelFormat="채널"
|
||||
ChannelFormat.None="없음"
|
||||
ChannelFormat.2_0ch="2채널"
|
||||
ChannelFormat.5_1ch="5.1채널"
|
||||
ChannelFormat.5_1chBack="5.1채널 (후면)"
|
||||
ChannelFormat.7_1ch="7.1채널"
|
||||
ChannelFormat.2_1ch="2.1 채널"
|
||||
ChannelFormat.4_0ch="4채널"
|
||||
ChannelFormat.4_1ch="4.1채널"
|
||||
ChannelFormat.5_1ch="5.1 채널"
|
||||
ChannelFormat.7_1ch="7.1 채널"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,18 @@ Device="Enhet"
|
|||
Mode="Modus"
|
||||
Buffering="Bruk bufring"
|
||||
PixelFormat="Pikselformat"
|
||||
ColorSpace="YUV fargerom"
|
||||
ColorSpace.Default="Standard"
|
||||
ColorRange="YUV fargerom"
|
||||
ColorRange.Default="Standard"
|
||||
ColorRange.Partial="Delvis"
|
||||
ColorRange.Full="Hel"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Ingen"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Apparaat"
|
|||
Mode="Modus"
|
||||
Buffering="Buffering Gebruiken"
|
||||
PixelFormat="Pixelindeling"
|
||||
ColorSpace="YUV-Kleurruimte"
|
||||
ColorSpace.Default="Standaard"
|
||||
ColorRange="YUV Kleurbereik"
|
||||
ColorRange.Default="Standaard"
|
||||
ColorRange.Partial="Gedeeltelijk"
|
||||
ColorRange.Full="Volledig"
|
||||
ChannelFormat="Kanaal"
|
||||
ChannelFormat.None="Geen"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Achter)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Urządzenie"
|
|||
Mode="Tryb"
|
||||
Buffering="Użyj buforowania"
|
||||
PixelFormat="Format pikseli"
|
||||
ColorSpace="Przestrzeń kolorów YUV"
|
||||
ColorSpace.Default="Domyślne"
|
||||
ColorRange="Zakres kolorów YUV"
|
||||
ColorRange.Default="Domyślne"
|
||||
ColorRange.Partial="Częściowy"
|
||||
ColorRange.Full="Pełny"
|
||||
ChannelFormat="Kanały"
|
||||
ChannelFormat.None="Brak"
|
||||
ChannelFormat.2_0ch="2.0"
|
||||
ChannelFormat.2_1ch="2.1"
|
||||
ChannelFormat.4_0ch="4.0"
|
||||
ChannelFormat.4_1ch="4.1"
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (tylne)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Dispositivo"
|
|||
Mode="Modo"
|
||||
Buffering="Utilizar Buffering"
|
||||
PixelFormat="Formato de Pixel"
|
||||
ColorSpace="Espaço de cor YUV"
|
||||
ColorSpace.Default="Padrão"
|
||||
ColorRange="Intervalo de Cores YUV"
|
||||
ColorRange.Default="Padrão"
|
||||
ColorRange.Partial="Parcial"
|
||||
ColorRange.Full="Completo"
|
||||
ChannelFormat="Canal"
|
||||
ChannelFormat.None="Nenhum"
|
||||
ChannelFormat.2_0ch="2.0"
|
||||
ChannelFormat.2_1ch="2.1"
|
||||
ChannelFormat.4_0ch="4.0"
|
||||
ChannelFormat.4_1ch="4.1"
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (Traseiro)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,7 @@ Device="Dispositivo"
|
|||
Mode="Modo"
|
||||
Buffering="Utilizar Buffering"
|
||||
PixelFormat="Formato de pixel"
|
||||
ColorRange.Partial="Parcial"
|
||||
ChannelFormat="Canal"
|
||||
ChannelFormat.None="Nenhum"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Устройство"
|
|||
Mode="Режим"
|
||||
Buffering="Использовать буферизацию"
|
||||
PixelFormat="Формат пикселей"
|
||||
ColorSpace="Цветовое пространство YUV"
|
||||
ColorSpace.Default="По умолчанию"
|
||||
ColorRange="Цветовой диапазон YUV"
|
||||
ColorRange.Default="По умолчанию"
|
||||
ColorRange.Partial="Частичный"
|
||||
ColorRange.Full="Полный"
|
||||
ChannelFormat="Конфигурация каналов"
|
||||
ChannelFormat.None="Нет"
|
||||
ChannelFormat.2_0ch="2-канальный"
|
||||
ChannelFormat.2_1ch="2.1-канальный"
|
||||
ChannelFormat.4_0ch="4-канальный"
|
||||
ChannelFormat.4_1ch="4.1-канальный"
|
||||
ChannelFormat.5_1ch="5.1-канальный"
|
||||
ChannelFormat.5_1chBack="5.1-канальный (Тыловой)"
|
||||
ChannelFormat.7_1ch="7.1-канальный"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,17 @@
|
|||
BlackmagicDevice="Blackmagic zariadenie"
|
||||
Device="Zariadenie"
|
||||
Mode="Mód"
|
||||
Buffering="Použiť vyrovnávaciu pamäť"
|
||||
PixelFormat="Formát pixelov"
|
||||
ColorSpace="Farebný priestor YUV"
|
||||
ColorSpace.Default="Predvolený"
|
||||
ColorRange="Rozsah farieb YUV"
|
||||
ColorRange.Default="Predvolený"
|
||||
ColorRange.Partial="Čiastočný"
|
||||
ColorRange.Full="Plný"
|
||||
ChannelFormat="Kanál"
|
||||
ChannelFormat.None="Nič"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Enhet"
|
|||
Mode="Läge"
|
||||
Buffering="Använd buffert"
|
||||
PixelFormat="Bildpunktsformat"
|
||||
ColorSpace="YUV-färgrymd"
|
||||
ColorSpace.Default="Standard"
|
||||
ColorRange="YUV-färgområde"
|
||||
ColorRange.Default="Standard"
|
||||
ColorRange.Partial="Partiell"
|
||||
ColorRange.Full="Full"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Ingen"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (bakom)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
ChannelFormat.2_1ch="2.1 kanaler"
|
||||
ChannelFormat.4_0ch="4 kanaler"
|
||||
ChannelFormat.4_1ch="4.1 kanaler"
|
||||
ChannelFormat.5_1ch="5.1 kanaler"
|
||||
ChannelFormat.7_1ch="7.1 kanaler"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,20 @@
|
|||
BlackmagicDevice="Blackmagic Aygıtı"
|
||||
Device="Aygıt"
|
||||
Mode="Mod"
|
||||
Buffering="Arabelleği Kullan"
|
||||
Buffering="Arabelleğe Almayı Kullan"
|
||||
PixelFormat="Piksel Biçimi"
|
||||
ColorSpace="YUV Renk Alanı"
|
||||
ColorSpace.Default="Varsayılan"
|
||||
ColorRange="YUV Renk Aralığı"
|
||||
ColorRange.Default="Varsayılan"
|
||||
ColorRange.Partial="Kısmi"
|
||||
ColorRange.Full="Tam"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Hiçbiri"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Arka)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="Пристрій"
|
|||
Mode="Режим"
|
||||
Buffering="Увімкнути буферизацію"
|
||||
PixelFormat="Формат пікселів"
|
||||
ColorSpace="Колірний простір YUV"
|
||||
ColorSpace.Default="За замовчуванням"
|
||||
ColorRange="Колірний діапазон YUV"
|
||||
ColorRange.Default="За замовчуванням"
|
||||
ColorRange.Partial="Частковий"
|
||||
ColorRange.Full="Повний"
|
||||
ChannelFormat="Звук (канали)"
|
||||
ChannelFormat.None="Немає"
|
||||
ChannelFormat.2_0ch="2-канальний"
|
||||
ChannelFormat.2_1ch="2.1-канальний"
|
||||
ChannelFormat.4_0ch="4-канальний"
|
||||
ChannelFormat.4_1ch="4.1-канальний"
|
||||
ChannelFormat.5_1ch="5.1-канальний"
|
||||
ChannelFormat.5_1chBack="5.1-канальний (Back)"
|
||||
ChannelFormat.7_1ch="7.1-канальний"
|
||||
|
||||
|
|
|
|||
9
plugins/decklink/data/locale/vi-VN.ini
Normal file
9
plugins/decklink/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
Mode="Chế độ"
|
||||
ColorSpace.Default="Mặc định"
|
||||
ColorRange.Default="Mặc định"
|
||||
ColorRange.Partial="Một phần"
|
||||
ColorRange.Full="Đầy đủ"
|
||||
ChannelFormat="Kênh"
|
||||
ChannelFormat.None="Không có"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
|
||||
|
|
@ -3,10 +3,18 @@ Device="设备"
|
|||
Mode="模式"
|
||||
Buffering="使用缓冲"
|
||||
PixelFormat="像素格式"
|
||||
ColorSpace="YUV 颜色空间"
|
||||
ColorSpace.Default="默认"
|
||||
ColorRange="YUV 颜色范围"
|
||||
ColorRange.Default="默认"
|
||||
ColorRange.Partial="局部"
|
||||
ColorRange.Full="全部"
|
||||
ChannelFormat="频道"
|
||||
ChannelFormat.None="无"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.2_1ch="2.1ch"
|
||||
ChannelFormat.4_0ch="4ch"
|
||||
ChannelFormat.4_1ch="4.1ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (后)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,18 @@ Device="裝置"
|
|||
Mode="模式"
|
||||
Buffering="使用緩衝"
|
||||
PixelFormat="像素格式"
|
||||
ColorSpace="YUV 色彩空間"
|
||||
ColorSpace.Default="預設"
|
||||
ColorRange="YUV 色彩範圍"
|
||||
ColorRange.Default="預設"
|
||||
ColorRange.Partial="部分"
|
||||
ColorRange.Full="完整"
|
||||
ChannelFormat="聲道"
|
||||
ChannelFormat.None="無"
|
||||
ChannelFormat.2_0ch="雙聲道"
|
||||
ChannelFormat.2_1ch="2.1聲道"
|
||||
ChannelFormat.4_0ch="4聲道"
|
||||
ChannelFormat.4_1ch="4.1聲道"
|
||||
ChannelFormat.5_1ch="5.1聲道"
|
||||
ChannelFormat.5_1chBack="5.1聲道(後置環繞喇叭)"
|
||||
ChannelFormat.7_1ch="7.1聲道"
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,11 @@
|
|||
#define LOG(level, message, ...) blog(level, "%s: " message, \
|
||||
obs_source_get_name(this->decklink->GetSource()), ##__VA_ARGS__)
|
||||
|
||||
#define ISSTEREO(flag) ((flag) == SPEAKERS_STEREO)
|
||||
#ifdef _WIN32
|
||||
#define IS_WIN 1
|
||||
#else
|
||||
#define IS_WIN 0
|
||||
#endif
|
||||
|
||||
static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
|
||||
{
|
||||
|
|
@ -26,8 +30,10 @@ static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
|
|||
static inline int ConvertChannelFormat(speaker_layout format)
|
||||
{
|
||||
switch (format) {
|
||||
case SPEAKERS_2POINT1:
|
||||
case SPEAKERS_4POINT0:
|
||||
case SPEAKERS_4POINT1:
|
||||
case SPEAKERS_5POINT1:
|
||||
case SPEAKERS_5POINT1_SURROUND:
|
||||
case SPEAKERS_7POINT1:
|
||||
return 8;
|
||||
|
||||
|
|
@ -40,13 +46,16 @@ static inline int ConvertChannelFormat(speaker_layout format)
|
|||
static inline audio_repack_mode_t ConvertRepackFormat(speaker_layout format)
|
||||
{
|
||||
switch (format) {
|
||||
case SPEAKERS_2POINT1:
|
||||
return repack_mode_8to3ch_swap23;
|
||||
case SPEAKERS_4POINT0:
|
||||
return repack_mode_8to4ch_swap23;
|
||||
case SPEAKERS_4POINT1:
|
||||
return repack_mode_8to5ch_swap23;
|
||||
case SPEAKERS_5POINT1:
|
||||
case SPEAKERS_5POINT1_SURROUND:
|
||||
return repack_mode_8to6ch_swap23;
|
||||
|
||||
case SPEAKERS_7POINT1:
|
||||
return repack_mode_8ch_swap23;
|
||||
|
||||
return repack_mode_8ch_swap23_swap46_swap57;
|
||||
default:
|
||||
assert(false && "No repack requested");
|
||||
return (audio_repack_mode_t)-1;
|
||||
|
|
@ -83,15 +92,29 @@ void DeckLinkDeviceInstance::HandleAudioPacket(
|
|||
currentPacket.frames = frameCount;
|
||||
currentPacket.timestamp = timestamp;
|
||||
|
||||
if (!ISSTEREO(channelFormat)) {
|
||||
if (decklink && !decklink->buffering) {
|
||||
currentPacket.timestamp = os_gettime_ns();
|
||||
currentPacket.timestamp -=
|
||||
(uint64_t)frameCount * 1000000000ULL /
|
||||
(uint64_t)currentPacket.samples_per_sec;
|
||||
}
|
||||
|
||||
int maxdevicechannel = device->GetMaxChannel();
|
||||
bool isWin = IS_WIN;
|
||||
|
||||
if (channelFormat != SPEAKERS_UNKNOWN &&
|
||||
channelFormat != SPEAKERS_MONO &&
|
||||
channelFormat != SPEAKERS_STEREO &&
|
||||
maxdevicechannel >= 8 &&
|
||||
isWin) {
|
||||
|
||||
if (audioRepacker->repack((uint8_t *)bytes, frameCount) < 0) {
|
||||
LOG(LOG_ERROR, "Failed to convert audio packet data");
|
||||
return;
|
||||
}
|
||||
|
||||
currentPacket.data[0] = (*audioRepacker)->packet_buffer;
|
||||
currentPacket.data[0] = (*audioRepacker)->packet_buffer;
|
||||
} else {
|
||||
currentPacket.data[0] = (uint8_t *)bytes;
|
||||
currentPacket.data[0] = (uint8_t *)bytes;
|
||||
}
|
||||
|
||||
nextAudioTS = timestamp +
|
||||
|
|
@ -118,16 +141,15 @@ void DeckLinkDeviceInstance::HandleVideoFrame(
|
|||
currentFrame.height = (uint32_t)videoFrame->GetHeight();
|
||||
currentFrame.timestamp = timestamp;
|
||||
|
||||
video_format_get_parameters(VIDEO_CS_601, VIDEO_RANGE_PARTIAL,
|
||||
currentFrame.color_matrix, currentFrame.color_range_min,
|
||||
currentFrame.color_range_max);
|
||||
|
||||
obs_source_output_video(decklink->GetSource(), ¤tFrame);
|
||||
}
|
||||
|
||||
void DeckLinkDeviceInstance::FinalizeStream()
|
||||
{
|
||||
input->SetCallback(nullptr);
|
||||
input->DisableVideoInput();
|
||||
if (channelFormat != SPEAKERS_UNKNOWN)
|
||||
input->DisableAudioInput();
|
||||
|
||||
if (audioRepacker != nullptr)
|
||||
{
|
||||
|
|
@ -138,6 +160,43 @@ void DeckLinkDeviceInstance::FinalizeStream()
|
|||
mode = nullptr;
|
||||
}
|
||||
|
||||
//#define LOG_SETUP_VIDEO_FORMAT 1
|
||||
|
||||
void DeckLinkDeviceInstance::SetupVideoFormat(DeckLinkDeviceMode *mode_)
|
||||
{
|
||||
if (mode_ == nullptr)
|
||||
return;
|
||||
|
||||
currentFrame.format = ConvertPixelFormat(pixelFormat);
|
||||
|
||||
colorSpace = decklink->GetColorSpace();
|
||||
if (colorSpace == VIDEO_CS_DEFAULT) {
|
||||
const BMDDisplayModeFlags flags = mode_->GetDisplayModeFlags();
|
||||
if (flags & bmdDisplayModeColorspaceRec709)
|
||||
activeColorSpace = VIDEO_CS_709;
|
||||
else if (flags & bmdDisplayModeColorspaceRec601)
|
||||
activeColorSpace = VIDEO_CS_601;
|
||||
else
|
||||
activeColorSpace = VIDEO_CS_DEFAULT;
|
||||
} else {
|
||||
activeColorSpace = colorSpace;
|
||||
}
|
||||
|
||||
colorRange = decklink->GetColorRange();
|
||||
currentFrame.full_range = colorRange == VIDEO_RANGE_FULL;
|
||||
|
||||
video_format_get_parameters(activeColorSpace, colorRange,
|
||||
currentFrame.color_matrix, currentFrame.color_range_min,
|
||||
currentFrame.color_range_max);
|
||||
|
||||
#ifdef LOG_SETUP_VIDEO_FORMAT
|
||||
LOG(LOG_INFO, "Setup video format: %s, %s, %s",
|
||||
pixelFormat == bmdFormat8BitYUV ? "YUV" : "RGB",
|
||||
activeColorSpace == VIDEO_CS_709 ? "BT.709" : "BT.601",
|
||||
colorRange == VIDEO_RANGE_FULL ? "full" : "limited");
|
||||
#endif
|
||||
}
|
||||
|
||||
bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
|
||||
{
|
||||
if (mode != nullptr)
|
||||
|
|
@ -150,33 +209,50 @@ bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
|
|||
if (!device->GetInput(&input))
|
||||
return false;
|
||||
|
||||
pixelFormat = decklink->GetPixelFormat();
|
||||
currentFrame.format = ConvertPixelFormat(pixelFormat);
|
||||
BMDVideoInputFlags flags;
|
||||
|
||||
const BMDDisplayMode displayMode = mode_->GetDisplayMode();
|
||||
bool isauto = mode_->GetName() == "Auto";
|
||||
if (isauto) {
|
||||
displayMode = bmdModeNTSC;
|
||||
pixelFormat = bmdFormat8BitYUV;
|
||||
flags = bmdVideoInputEnableFormatDetection;
|
||||
} else {
|
||||
displayMode = mode_->GetDisplayMode();
|
||||
pixelFormat = decklink->GetPixelFormat();
|
||||
flags = bmdVideoInputFlagDefault;
|
||||
}
|
||||
|
||||
const HRESULT videoResult = input->EnableVideoInput(displayMode,
|
||||
pixelFormat, bmdVideoInputFlagDefault);
|
||||
|
||||
pixelFormat, flags);
|
||||
if (videoResult != S_OK) {
|
||||
LOG(LOG_ERROR, "Failed to enable video input");
|
||||
return false;
|
||||
}
|
||||
|
||||
SetupVideoFormat(mode_);
|
||||
|
||||
channelFormat = decklink->GetChannelFormat();
|
||||
currentPacket.speakers = channelFormat;
|
||||
|
||||
int maxdevicechannel = device->GetMaxChannel();
|
||||
bool isWin = IS_WIN;
|
||||
|
||||
if (channelFormat != SPEAKERS_UNKNOWN) {
|
||||
const int channel = ConvertChannelFormat(channelFormat);
|
||||
const HRESULT audioResult = input->EnableAudioInput(
|
||||
bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger,
|
||||
channel);
|
||||
|
||||
if (audioResult != S_OK)
|
||||
LOG(LOG_WARNING, "Failed to enable audio input; continuing...");
|
||||
|
||||
if (!ISSTEREO(channelFormat)) {
|
||||
const audio_repack_mode_t repack_mode = ConvertRepackFormat(channelFormat);
|
||||
if (channelFormat != SPEAKERS_UNKNOWN &&
|
||||
channelFormat != SPEAKERS_MONO &&
|
||||
channelFormat != SPEAKERS_STEREO &&
|
||||
maxdevicechannel >= 8 &&
|
||||
isWin) {
|
||||
|
||||
const audio_repack_mode_t repack_mode = ConvertRepackFormat
|
||||
(channelFormat);
|
||||
audioRepacker = new AudioRepacker(repack_mode);
|
||||
}
|
||||
}
|
||||
|
|
@ -257,12 +333,41 @@ HRESULT STDMETHODCALLTYPE DeckLinkDeviceInstance::VideoInputFormatChanged(
|
|||
IDeckLinkDisplayMode *newMode,
|
||||
BMDDetectedVideoInputFormatFlags detectedSignalFlags)
|
||||
{
|
||||
UNUSED_PARAMETER(events);
|
||||
UNUSED_PARAMETER(newMode);
|
||||
UNUSED_PARAMETER(detectedSignalFlags);
|
||||
input->PauseStreams();
|
||||
|
||||
// There is no implementation for automatic format detection, so this
|
||||
// method goes unused.
|
||||
mode->SetMode(newMode);
|
||||
|
||||
if (events & bmdVideoInputDisplayModeChanged) {
|
||||
displayMode = mode->GetDisplayMode();
|
||||
}
|
||||
|
||||
if (events & bmdVideoInputColorspaceChanged) {
|
||||
switch (detectedSignalFlags) {
|
||||
case bmdDetectedVideoInputRGB444:
|
||||
pixelFormat = bmdFormat8BitBGRA;
|
||||
break;
|
||||
|
||||
default:
|
||||
case bmdDetectedVideoInputYCbCr422:
|
||||
pixelFormat = bmdFormat8BitYUV;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const HRESULT videoResult = input->EnableVideoInput(displayMode,
|
||||
pixelFormat, bmdVideoInputEnableFormatDetection);
|
||||
if (videoResult != S_OK) {
|
||||
LOG(LOG_ERROR, "Failed to enable video input");
|
||||
input->StopStreams();
|
||||
FinalizeStream();
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
SetupVideoFormat(mode);
|
||||
|
||||
input->FlushStreams();
|
||||
input->StartStreams();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,11 @@ protected:
|
|||
DeckLink *decklink = nullptr;
|
||||
DeckLinkDevice *device = nullptr;
|
||||
DeckLinkDeviceMode *mode = nullptr;
|
||||
BMDDisplayMode displayMode = bmdModeNTSC;
|
||||
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
|
||||
video_colorspace colorSpace = VIDEO_CS_DEFAULT;
|
||||
video_colorspace activeColorSpace = VIDEO_CS_DEFAULT;
|
||||
video_range_type colorRange = VIDEO_RANGE_DEFAULT;
|
||||
ComPtr<IDeckLinkInput> input;
|
||||
volatile long refCount = 1;
|
||||
int64_t audioOffset = 0;
|
||||
|
|
@ -21,6 +25,7 @@ protected:
|
|||
speaker_layout channelFormat = SPEAKERS_STEREO;
|
||||
|
||||
void FinalizeStream();
|
||||
void SetupVideoFormat(DeckLinkDeviceMode *mode_);
|
||||
|
||||
void HandleAudioPacket(IDeckLinkAudioInputPacket *audioPacket,
|
||||
const uint64_t timestamp);
|
||||
|
|
@ -38,6 +43,8 @@ public:
|
|||
}
|
||||
|
||||
inline BMDPixelFormat GetActivePixelFormat() const {return pixelFormat;}
|
||||
inline video_colorspace GetActiveColorSpace() const {return colorSpace;}
|
||||
inline video_range_type GetActiveColorRange() const {return colorRange;}
|
||||
inline speaker_layout GetActiveChannelFormat() const {return channelFormat;}
|
||||
|
||||
inline DeckLinkDeviceMode *GetMode() const {return mode;}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,14 @@ BMDDisplayMode DeckLinkDeviceMode::GetDisplayMode(void) const
|
|||
return bmdModeUnknown;
|
||||
}
|
||||
|
||||
BMDDisplayModeFlags DeckLinkDeviceMode::GetDisplayModeFlags(void) const
|
||||
{
|
||||
if (mode != nullptr)
|
||||
return mode->GetFlags();
|
||||
|
||||
return (BMDDisplayModeFlags)0;
|
||||
}
|
||||
|
||||
long long DeckLinkDeviceMode::GetId(void) const
|
||||
{
|
||||
return id;
|
||||
|
|
@ -41,3 +49,14 @@ const std::string& DeckLinkDeviceMode::GetName(void) const
|
|||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
void DeckLinkDeviceMode::SetMode(IDeckLinkDisplayMode *mode_)
|
||||
{
|
||||
IDeckLinkDisplayMode *old = mode;
|
||||
if (old != nullptr)
|
||||
old->Release();
|
||||
|
||||
mode = mode_;
|
||||
if (mode != nullptr)
|
||||
mode->AddRef();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#define MODE_ID_AUTO -1
|
||||
|
||||
class DeckLinkDeviceMode {
|
||||
protected:
|
||||
long long id;
|
||||
|
|
@ -16,6 +18,9 @@ public:
|
|||
virtual ~DeckLinkDeviceMode(void);
|
||||
|
||||
BMDDisplayMode GetDisplayMode(void) const;
|
||||
BMDDisplayModeFlags GetDisplayModeFlags(void) const;
|
||||
long long GetId(void) const;
|
||||
const std::string& GetName(void) const;
|
||||
|
||||
void SetMode(IDeckLinkDisplayMode *mode);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -29,6 +29,21 @@ ULONG DeckLinkDevice::Release()
|
|||
|
||||
bool DeckLinkDevice::Init()
|
||||
{
|
||||
ComPtr<IDeckLinkAttributes> attributes;
|
||||
const HRESULT result = device->QueryInterface(IID_IDeckLinkAttributes,
|
||||
(void **)&attributes);
|
||||
|
||||
if (result == S_OK) {
|
||||
decklink_bool_t detectable = false;
|
||||
if (attributes->GetFlag(BMDDeckLinkSupportsInputFormatDetection,
|
||||
&detectable) == S_OK && !!detectable) {
|
||||
DeckLinkDeviceMode *mode =
|
||||
new DeckLinkDeviceMode("Auto", MODE_ID_AUTO);
|
||||
modes.push_back(mode);
|
||||
modeIdMap[MODE_ID_AUTO] = mode;
|
||||
}
|
||||
}
|
||||
|
||||
ComPtr<IDeckLinkInput> input;
|
||||
if (device->QueryInterface(IID_IDeckLinkInput, (void**)&input) != S_OK)
|
||||
return false;
|
||||
|
|
@ -66,9 +81,6 @@ bool DeckLinkDevice::Init()
|
|||
|
||||
hash = displayName;
|
||||
|
||||
ComPtr<IDeckLinkAttributes> attributes;
|
||||
const HRESULT result = device->QueryInterface(IID_IDeckLinkAttributes,
|
||||
(void **)&attributes);
|
||||
if (result != S_OK)
|
||||
return true;
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId)
|
|||
return false;
|
||||
if (instance->GetActiveModeId() == modeId &&
|
||||
instance->GetActivePixelFormat() == pixelFormat &&
|
||||
instance->GetActiveColorSpace() == colorSpace &&
|
||||
instance->GetActiveColorRange() == colorRange &&
|
||||
instance->GetActiveChannelFormat() == channelFormat)
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ protected:
|
|||
volatile long activateRefs = 0;
|
||||
std::recursive_mutex deviceMutex;
|
||||
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
|
||||
video_colorspace colorSpace = VIDEO_CS_DEFAULT;
|
||||
video_range_type colorRange = VIDEO_RANGE_DEFAULT;
|
||||
speaker_layout channelFormat = SPEAKERS_STEREO;
|
||||
|
||||
void SaveSettings();
|
||||
|
|
@ -42,6 +44,16 @@ public:
|
|||
{
|
||||
pixelFormat = format;
|
||||
}
|
||||
inline video_colorspace GetColorSpace() const {return colorSpace;}
|
||||
inline void SetColorSpace(video_colorspace format)
|
||||
{
|
||||
colorSpace = format;
|
||||
}
|
||||
inline video_range_type GetColorRange() const {return colorRange;}
|
||||
inline void SetColorRange(video_range_type format)
|
||||
{
|
||||
colorRange = format;
|
||||
}
|
||||
inline speaker_layout GetChannelFormat() const {return channelFormat;}
|
||||
inline void SetChannelFormat(speaker_layout format)
|
||||
{
|
||||
|
|
@ -50,4 +62,6 @@ public:
|
|||
|
||||
bool Activate(DeckLinkDevice *device, long long modeId);
|
||||
void Deactivate();
|
||||
|
||||
bool buffering = false;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#if defined(_WIN32)
|
||||
#include <DeckLinkAPI.h>
|
||||
typedef BOOL decklink_bool_t;
|
||||
typedef BSTR decklink_string_t;
|
||||
IDeckLinkDiscovery *CreateDeckLinkDiscoveryInstance(void);
|
||||
#define IUnknownUUID IID_IUnknown
|
||||
|
|
@ -10,9 +11,11 @@ typedef REFIID CFUUIDBytes;
|
|||
#elif defined(__APPLE__)
|
||||
#include "mac/decklink-sdk/DeckLinkAPI.h"
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
typedef bool decklink_bool_t;
|
||||
typedef CFStringRef decklink_string_t;
|
||||
#elif defined(__linux__)
|
||||
#include "linux/decklink-sdk/DeckLinkAPI.h"
|
||||
typedef bool decklink_bool_t;
|
||||
typedef const char *decklink_string_t;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -13,16 +13,26 @@ OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US")
|
|||
#define MODE_NAME "mode_name"
|
||||
#define CHANNEL_FORMAT "channel_format"
|
||||
#define PIXEL_FORMAT "pixel_format"
|
||||
#define COLOR_SPACE "color_space"
|
||||
#define COLOR_RANGE "color_range"
|
||||
#define BUFFERING "buffering"
|
||||
|
||||
#define TEXT_DEVICE obs_module_text("Device")
|
||||
#define TEXT_MODE obs_module_text("Mode")
|
||||
#define TEXT_PIXEL_FORMAT obs_module_text("PixelFormat")
|
||||
#define TEXT_COLOR_SPACE obs_module_text("ColorSpace")
|
||||
#define TEXT_COLOR_SPACE_DEFAULT obs_module_text("ColorSpace.Default")
|
||||
#define TEXT_COLOR_RANGE obs_module_text("ColorRange")
|
||||
#define TEXT_COLOR_RANGE_DEFAULT obs_module_text("ColorRange.Default")
|
||||
#define TEXT_COLOR_RANGE_PARTIAL obs_module_text("ColorRange.Partial")
|
||||
#define TEXT_COLOR_RANGE_FULL obs_module_text("ColorRange.Full")
|
||||
#define TEXT_CHANNEL_FORMAT obs_module_text("ChannelFormat")
|
||||
#define TEXT_CHANNEL_FORMAT_NONE obs_module_text("ChannelFormat.None")
|
||||
#define TEXT_CHANNEL_FORMAT_2_0CH obs_module_text("ChannelFormat.2_0ch")
|
||||
#define TEXT_CHANNEL_FORMAT_2_1CH obs_module_text("ChannelFormat.2_1ch")
|
||||
#define TEXT_CHANNEL_FORMAT_4_0CH obs_module_text("ChannelFormat.4_0ch")
|
||||
#define TEXT_CHANNEL_FORMAT_4_1CH obs_module_text("ChannelFormat.4_1ch")
|
||||
#define TEXT_CHANNEL_FORMAT_5_1CH obs_module_text("ChannelFormat.5_1ch")
|
||||
#define TEXT_CHANNEL_FORMAT_5_1CH_BACK obs_module_text("ChannelFormat.5_1chBack")
|
||||
#define TEXT_CHANNEL_FORMAT_7_1CH obs_module_text("ChannelFormat.7_1ch")
|
||||
#define TEXT_BUFFERING obs_module_text("Buffering")
|
||||
|
||||
|
|
@ -32,12 +42,14 @@ static void decklink_enable_buffering(DeckLink *decklink, bool enabled)
|
|||
{
|
||||
obs_source_t *source = decklink->GetSource();
|
||||
obs_source_set_async_unbuffered(source, !enabled);
|
||||
decklink->buffering = enabled;
|
||||
}
|
||||
|
||||
static void *decklink_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
DeckLink *decklink = new DeckLink(source, deviceEnum);
|
||||
|
||||
obs_source_set_async_decoupled(source, true);
|
||||
decklink_enable_buffering(decklink,
|
||||
obs_data_get_bool(settings, BUFFERING));
|
||||
|
||||
|
|
@ -58,8 +70,19 @@ static void decklink_update(void *data, obs_data_t *settings)
|
|||
long long id = obs_data_get_int(settings, MODE_ID);
|
||||
BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
|
||||
PIXEL_FORMAT);
|
||||
speaker_layout channelFormat = (speaker_layout)obs_data_get_int(settings,
|
||||
CHANNEL_FORMAT);
|
||||
video_colorspace colorSpace = (video_colorspace)obs_data_get_int(settings,
|
||||
COLOR_SPACE);
|
||||
video_range_type colorRange = (video_range_type)obs_data_get_int(settings,
|
||||
COLOR_RANGE);
|
||||
int chFmtInt = (int)obs_data_get_int(settings, CHANNEL_FORMAT);
|
||||
|
||||
if (chFmtInt == 7) {
|
||||
chFmtInt = SPEAKERS_5POINT1;
|
||||
} else if (chFmtInt < SPEAKERS_UNKNOWN || chFmtInt > SPEAKERS_7POINT1) {
|
||||
chFmtInt = 2;
|
||||
}
|
||||
|
||||
speaker_layout channelFormat = (speaker_layout)chFmtInt;
|
||||
|
||||
decklink_enable_buffering(decklink,
|
||||
obs_data_get_bool(settings, BUFFERING));
|
||||
|
|
@ -68,14 +91,18 @@ static void decklink_update(void *data, obs_data_t *settings)
|
|||
device.Set(deviceEnum->FindByHash(hash));
|
||||
|
||||
decklink->SetPixelFormat(pixelFormat);
|
||||
decklink->SetColorSpace(colorSpace);
|
||||
decklink->SetColorRange(colorRange);
|
||||
decklink->SetChannelFormat(channelFormat);
|
||||
decklink->Activate(device, id);
|
||||
}
|
||||
|
||||
static void decklink_get_defaults(obs_data_t *settings)
|
||||
{
|
||||
obs_data_set_default_bool(settings, BUFFERING, true);
|
||||
obs_data_set_default_bool(settings, BUFFERING, false);
|
||||
obs_data_set_default_int(settings, PIXEL_FORMAT, bmdFormat8BitYUV);
|
||||
obs_data_set_default_int(settings, COLOR_SPACE, VIDEO_CS_DEFAULT);
|
||||
obs_data_set_default_int(settings, COLOR_RANGE, VIDEO_RANGE_DEFAULT);
|
||||
obs_data_set_default_int(settings, CHANNEL_FORMAT, SPEAKERS_STEREO);
|
||||
}
|
||||
|
||||
|
|
@ -136,10 +163,14 @@ static bool decklink_device_changed(obs_properties_t *props,
|
|||
}
|
||||
|
||||
if (device->GetMaxChannel() >= 8) {
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_2_1CH,
|
||||
SPEAKERS_2POINT1);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_4_0CH,
|
||||
SPEAKERS_4POINT0);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_4_1CH,
|
||||
SPEAKERS_4POINT1);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_5_1CH,
|
||||
SPEAKERS_5POINT1);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_5_1CH_BACK,
|
||||
SPEAKERS_5POINT1_SURROUND);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_7_1CH,
|
||||
SPEAKERS_7POINT1);
|
||||
}
|
||||
|
|
@ -162,6 +193,38 @@ static void fill_out_devices(obs_property_t *list)
|
|||
deviceEnum->Unlock();
|
||||
}
|
||||
|
||||
static bool color_format_changed(obs_properties_t *props,
|
||||
obs_property_t *list, obs_data_t *settings);
|
||||
|
||||
static bool mode_id_changed(obs_properties_t *props,
|
||||
obs_property_t *list, obs_data_t *settings)
|
||||
{
|
||||
long long id = obs_data_get_int(settings, MODE_ID);
|
||||
|
||||
list = obs_properties_get(props, PIXEL_FORMAT);
|
||||
obs_property_set_visible(list, id != MODE_ID_AUTO);
|
||||
|
||||
return color_format_changed(props, nullptr, settings);
|
||||
}
|
||||
|
||||
static bool color_format_changed(obs_properties_t *props,
|
||||
obs_property_t *list, obs_data_t *settings)
|
||||
{
|
||||
long long id = obs_data_get_int(settings, MODE_ID);
|
||||
BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
|
||||
PIXEL_FORMAT);
|
||||
|
||||
list = obs_properties_get(props, COLOR_SPACE);
|
||||
obs_property_set_visible(list,
|
||||
id != MODE_ID_AUTO && pixelFormat == bmdFormat8BitYUV);
|
||||
|
||||
list = obs_properties_get(props, COLOR_RANGE);
|
||||
obs_property_set_visible(list,
|
||||
id == MODE_ID_AUTO || pixelFormat == bmdFormat8BitYUV);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static obs_properties_t *decklink_get_properties(void *data)
|
||||
{
|
||||
obs_properties_t *props = obs_properties_create();
|
||||
|
|
@ -174,13 +237,28 @@ static obs_properties_t *decklink_get_properties(void *data)
|
|||
|
||||
list = obs_properties_add_list(props, MODE_ID, TEXT_MODE,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
obs_property_set_modified_callback(list, mode_id_changed);
|
||||
|
||||
list = obs_properties_add_list(props, PIXEL_FORMAT,
|
||||
TEXT_PIXEL_FORMAT, OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_INT);
|
||||
obs_property_set_modified_callback(list, color_format_changed);
|
||||
|
||||
obs_property_list_add_int(list, "8-bit YUV", bmdFormat8BitYUV);
|
||||
obs_property_list_add_int(list, "8-bit BGRA", bmdFormat8BitBGRA);
|
||||
|
||||
list = obs_properties_add_list(props, COLOR_SPACE, TEXT_COLOR_SPACE,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
obs_property_list_add_int(list, TEXT_COLOR_SPACE_DEFAULT, VIDEO_CS_DEFAULT);
|
||||
obs_property_list_add_int(list, "BT.601", VIDEO_CS_601);
|
||||
obs_property_list_add_int(list, "BT.709", VIDEO_CS_709);
|
||||
|
||||
list = obs_properties_add_list(props, COLOR_RANGE, TEXT_COLOR_RANGE,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
obs_property_list_add_int(list, TEXT_COLOR_RANGE_DEFAULT, VIDEO_RANGE_DEFAULT);
|
||||
obs_property_list_add_int(list, TEXT_COLOR_RANGE_PARTIAL, VIDEO_RANGE_PARTIAL);
|
||||
obs_property_list_add_int(list, TEXT_COLOR_RANGE_FULL, VIDEO_RANGE_FULL);
|
||||
|
||||
list = obs_properties_add_list(props, CHANNEL_FORMAT,
|
||||
TEXT_CHANNEL_FORMAT, OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_INT);
|
||||
|
|
@ -188,6 +266,16 @@ static obs_properties_t *decklink_get_properties(void *data)
|
|||
SPEAKERS_UNKNOWN);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_0CH,
|
||||
SPEAKERS_STEREO);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_1CH,
|
||||
SPEAKERS_2POINT1);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_4_0CH,
|
||||
SPEAKERS_4POINT0);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_4_1CH,
|
||||
SPEAKERS_4POINT1);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_5_1CH,
|
||||
SPEAKERS_5POINT1);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_7_1CH,
|
||||
SPEAKERS_7POINT1);
|
||||
|
||||
obs_properties_add_bool(props, BUFFERING, TEXT_BUFFERING);
|
||||
|
||||
|
|
|
|||
|
|
@ -6,12 +6,28 @@ SlideShow="Presentació de diapositives"
|
|||
SlideShow.TransitionSpeed="Velocitat de la transició (mil·lisegons)"
|
||||
SlideShow.SlideTime="Temps entre diapositives (mil·lisegons)"
|
||||
SlideShow.Files="Fitxers d'imatge"
|
||||
SlideShow.CustomSize="Relació d'aspecte"
|
||||
SlideShow.CustomSize.Auto="Automàtic"
|
||||
SlideShow.Randomize="Reproducció aleatòria"
|
||||
SlideShow.Loop="Bucle"
|
||||
SlideShow.Transition="Transició"
|
||||
SlideShow.Transition.Cut="Tall"
|
||||
SlideShow.Transition.Fade="Desaparèixer"
|
||||
SlideShow.Transition.Swipe="De cop"
|
||||
SlideShow.Transition.Slide="Diapositiva"
|
||||
SlideShow.PlaybackBehavior="Comportament de la visibilitat"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Atura quan no sigui visible, reinicia quan sigui visible"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pausa quan no sigui visible, reprèn quan sigui visible"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Reprodueix sempre fins i tot quan no sigui visible"
|
||||
SlideShow.SlideMode="Mode de diapositives"
|
||||
SlideShow.SlideMode.Auto="Automàtic"
|
||||
SlideShow.SlideMode.Manual="Manual (ús de tecles per controlar les diapositives)"
|
||||
SlideShow.PlayPause="Reprodueix/Pausa"
|
||||
SlideShow.Restart="Reinicia"
|
||||
SlideShow.Stop="Atura"
|
||||
SlideShow.NextSlide="Diapositiva següent"
|
||||
SlideShow.PreviousSlide="Diapositiva anterior"
|
||||
SlideShow.HideWhenDone="Amaga en finalitzar la presentació"
|
||||
|
||||
ColorSource="Origen del color"
|
||||
ColorSource.Color="Color"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Soubory obrázků"
|
|||
SlideShow.CustomSize="Poměr stran"
|
||||
SlideShow.CustomSize.Auto="Automatický"
|
||||
SlideShow.Randomize="Náhodné přehrávání"
|
||||
SlideShow.Loop="Opakovat"
|
||||
SlideShow.Transition="Přechod"
|
||||
SlideShow.Transition.Cut="Střih"
|
||||
SlideShow.Transition.Fade="Slábnutí"
|
||||
SlideShow.Transition.Swipe="Tažení"
|
||||
SlideShow.Transition.Slide="Sklouznutí"
|
||||
SlideShow.PlaybackBehavior="Závislost na viditelnosti"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Zastavit při skrytém, restartovat při obnovení"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pozastavit při skrytém, pokračovat při obnovení"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Přehrát vždy (i když není vidět)"
|
||||
SlideShow.SlideMode="Režim prezentace"
|
||||
SlideShow.SlideMode.Auto="Automatický"
|
||||
SlideShow.SlideMode.Manual="Manuální (pro ovládání prezentace je nutné použít zkratky)"
|
||||
SlideShow.PlayPause="Přehrát/Pozastavit"
|
||||
SlideShow.Restart="Restartovat"
|
||||
SlideShow.Stop="Zastavit"
|
||||
SlideShow.NextSlide="Další snímek"
|
||||
SlideShow.PreviousSlide="Předchozí snímek"
|
||||
SlideShow.HideWhenDone="Skrýt na konci prezentace"
|
||||
|
||||
ColorSource="Zdroj barvy"
|
||||
ColorSource.Color="Barva"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Billedfiler"
|
|||
SlideShow.CustomSize="Afgrænsningsstørrelse/Formatforhold"
|
||||
SlideShow.CustomSize.Auto="Automatisk"
|
||||
SlideShow.Randomize="Tilfældig afspilning"
|
||||
SlideShow.Loop="Gentagelse"
|
||||
SlideShow.Transition="Overgang"
|
||||
SlideShow.Transition.Cut="Klip"
|
||||
SlideShow.Transition.Fade="Overgang"
|
||||
SlideShow.Transition.Swipe="Stryg"
|
||||
SlideShow.Transition.Slide="Glide"
|
||||
SlideShow.PlaybackBehavior="Synlighedsadfærd"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Stop når ikke synlig, genstart når synlig"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Sæt på pause når ikke synlig, genoptag når synlig"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Afspil altid også når usynlig"
|
||||
SlideShow.SlideMode="Diasshowtilstand"
|
||||
SlideShow.SlideMode.Auto="Automatisk"
|
||||
SlideShow.SlideMode.Manual="Manuel (styr diasshow via genvejstaster)"
|
||||
SlideShow.PlayPause="Afspil/pause"
|
||||
SlideShow.Restart="Genstart"
|
||||
SlideShow.Stop="Stop"
|
||||
SlideShow.NextSlide="Næste dias"
|
||||
SlideShow.PreviousSlide="Foregående dias"
|
||||
SlideShow.HideWhenDone="Skjul når diasshow er færdigt"
|
||||
|
||||
ColorSource="Farvekilde"
|
||||
ColorSource.Color="Farve"
|
||||
|
|
|
|||
|
|
@ -3,17 +3,31 @@ File="Bilddatei"
|
|||
UnloadWhenNotShowing="Entlade Bild, wenn es nicht angezeigt wird"
|
||||
|
||||
SlideShow="Diashow"
|
||||
SlideShow.TransitionSpeed="Geschwindigkeit des Übergangs (Millisekunden)"
|
||||
SlideShow.TransitionSpeed="Übergangsgeschwindigkeit (Millisekunden)"
|
||||
SlideShow.SlideTime="Zeit zwischen Bildern (Millisekunden)"
|
||||
SlideShow.Files="Bilddateien"
|
||||
SlideShow.CustomSize="Rahmen Größe/Seitenverhältnis"
|
||||
SlideShow.CustomSize.Auto="Automatisch"
|
||||
SlideShow.Randomize="Zufällige Wiedergabe"
|
||||
SlideShow.Loop="Endlosschleife"
|
||||
SlideShow.Transition="Übergang"
|
||||
SlideShow.Transition.Cut="Schnitt"
|
||||
SlideShow.Transition.Fade="Überblenden"
|
||||
SlideShow.Transition.Swipe="Swipe"
|
||||
SlideShow.Transition.Slide="Slide"
|
||||
SlideShow.PlaybackBehavior="Sichtbarkeitsverhalten"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Anhalten wenn nicht sichtbar, neu starten wenn sichtbar"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pausieren wenn nicht sichtbar, fortsetzen wenn sichtbar"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Immer abspielen, auch wenn nicht sichtbar"
|
||||
SlideShow.SlideMode="Diashowmodus"
|
||||
SlideShow.SlideMode.Auto="Automatisch"
|
||||
SlideShow.SlideMode.Manual="Manuell (Hotkeys verwenden, um Diashow zu steuern)"
|
||||
SlideShow.PlayPause="Abspielen/Pausieren"
|
||||
SlideShow.Restart="Neu starten"
|
||||
SlideShow.Stop="Stop"
|
||||
SlideShow.NextSlide="Nächstes Bild"
|
||||
SlideShow.PreviousSlide="Vorheriges Bild"
|
||||
SlideShow.HideWhenDone="Verbergen, wenn die Diashow vorbei ist"
|
||||
|
||||
ColorSource="Farbquelle"
|
||||
ColorSource.Color="Farbe"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,21 @@ ImageInput="Εικόνα"
|
|||
File="Αρχείο εικόνας"
|
||||
UnloadWhenNotShowing="Ξεφόρτωση εικόνας όταν δεν εμφανίζεται"
|
||||
|
||||
SlideShow.Files="Αρχεία φωτογραφίας"
|
||||
SlideShow="Παρουσίαση Εικόνων"
|
||||
SlideShow.TransitionSpeed="Ταχύτητα μετάβασης (χιλιοστά δευτερολέπτου)"
|
||||
SlideShow.SlideTime="Χρόνος μεταξύ των διαφανειών (χιλιοστά δευτερολέπτου)"
|
||||
SlideShow.Files="Αρχεία εικόνων"
|
||||
SlideShow.CustomSize="Μέγεθος Οριοθέτησης/Αναλογία"
|
||||
SlideShow.CustomSize.Auto="Αυτόματο"
|
||||
SlideShow.Randomize="Τυχαιοποίηση αναπαραγωγής"
|
||||
SlideShow.Transition="Μετάβαση"
|
||||
SlideShow.Transition.Cut="Αποκοπή"
|
||||
SlideShow.Transition.Fade="Ξεθώριασμα"
|
||||
SlideShow.Transition.Swipe="Σύρσιμο"
|
||||
SlideShow.Transition.Slide="Ολίσθηση"
|
||||
|
||||
ColorSource="Πηγή χρώματος"
|
||||
ColorSource.Color="Χρώμα"
|
||||
ColorSource.Width="Πλάτος"
|
||||
ColorSource.Height="Ύψος"
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Image Files"
|
|||
SlideShow.CustomSize="Bounding Size/Aspect Ratio"
|
||||
SlideShow.CustomSize.Auto="Automatic"
|
||||
SlideShow.Randomize="Randomize Playback"
|
||||
SlideShow.Loop="Loop"
|
||||
SlideShow.Transition="Transition"
|
||||
SlideShow.Transition.Cut="Cut"
|
||||
SlideShow.Transition.Fade="Fade"
|
||||
SlideShow.Transition.Swipe="Swipe"
|
||||
SlideShow.Transition.Slide="Slide"
|
||||
SlideShow.PlaybackBehavior="Visibility Behavior"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Stop when not visible, restart when visible"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pause when not visible, unpause when visible"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Always play even when not visible"
|
||||
SlideShow.SlideMode="Slide Mode"
|
||||
SlideShow.SlideMode.Auto="Automatic"
|
||||
SlideShow.SlideMode.Manual="Manual (Use hotkeys to control slideshow)"
|
||||
SlideShow.PlayPause="Play/Pause"
|
||||
SlideShow.Restart="Restart"
|
||||
SlideShow.Stop="Stop"
|
||||
SlideShow.NextSlide="Next Slide"
|
||||
SlideShow.PreviousSlide="Previous Slide"
|
||||
SlideShow.HideWhenDone="Hide when slideshow is done"
|
||||
|
||||
ColorSource="Color Source"
|
||||
ColorSource.Color="Color"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Archivo de imagen"
|
|||
SlideShow.CustomSize="Relación de aspecto"
|
||||
SlideShow.CustomSize.Auto="Automático"
|
||||
SlideShow.Randomize="Reproducción aleatoria"
|
||||
SlideShow.Loop="Bucle"
|
||||
SlideShow.Transition="Transición"
|
||||
SlideShow.Transition.Cut="Corte"
|
||||
SlideShow.Transition.Fade="Desvanecimiento"
|
||||
SlideShow.Transition.Swipe="Deslizar Rapido"
|
||||
SlideShow.Transition.Slide="Deslizar"
|
||||
SlideShow.PlaybackBehavior="Comportamiento de visibilidad"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Detener cuando no sea visible, reiniciar cuando sea visible"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pausar cuando no sea visible, reanudar cuando sea visible"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Reproducir siempre incluso cuando no sea visible"
|
||||
SlideShow.SlideMode="Modo de diapositivas"
|
||||
SlideShow.SlideMode.Auto="Automático"
|
||||
SlideShow.SlideMode.Manual="Manual (uso de teclas para controlar las diapositivas)"
|
||||
SlideShow.PlayPause="Reproducir/Pausar"
|
||||
SlideShow.Restart="Reiniciar"
|
||||
SlideShow.Stop="Detener"
|
||||
SlideShow.NextSlide="Siguiente diapositiva"
|
||||
SlideShow.PreviousSlide="Diapositiva anterior"
|
||||
SlideShow.HideWhenDone="Ocultar cuando se acabe la presentación"
|
||||
|
||||
ColorSource="Origen de color"
|
||||
ColorSource.Color="Color"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Irudi fitxategiak"
|
|||
SlideShow.CustomSize="Markoaren tamaina/Aspektu-erlazioa"
|
||||
SlideShow.CustomSize.Auto="Automatikoa"
|
||||
SlideShow.Randomize="Ausazko erreprodukzioa"
|
||||
SlideShow.Loop="Begizta"
|
||||
SlideShow.Transition="Trantsizioa"
|
||||
SlideShow.Transition.Cut="Ebaki"
|
||||
SlideShow.Transition.Fade="Iraungi"
|
||||
SlideShow.Transition.Swipe="Korritu"
|
||||
SlideShow.Transition.Slide="Irristatu"
|
||||
SlideShow.PlaybackBehavior="Ikuste-jokabidea"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Ikusten ez bada gelditu, ikusten denean berrabiarazi"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Ikusten ez bada pausatu, ikusten denean jarraitu"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Erreproduzitu beti nahiz eta ez ikusi"
|
||||
SlideShow.SlideMode="Diapositiba modua"
|
||||
SlideShow.SlideMode.Auto="Automatikoa"
|
||||
SlideShow.SlideMode.Manual="Eskuz (erabili teklak kontrolatzeko aurkezpena)"
|
||||
SlideShow.PlayPause=" Erreproduzitu/Pausarazi"
|
||||
SlideShow.Restart="Berrabiarazi"
|
||||
SlideShow.Stop="Gelditu"
|
||||
SlideShow.NextSlide="Hurrengo diapositiba"
|
||||
SlideShow.PreviousSlide="Aurreko diapositiba"
|
||||
SlideShow.HideWhenDone="Ezkutatu aurkezpena bukatzean"
|
||||
|
||||
ColorSource="Kolorearen iturburua"
|
||||
ColorSource.Color="Kolorea"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Kuvatiedostot"
|
|||
SlideShow.CustomSize="Rajauskoko/Kuvasuhde"
|
||||
SlideShow.CustomSize.Auto="Automaattinen"
|
||||
SlideShow.Randomize="Toista satunnaisesti"
|
||||
SlideShow.Loop="Toista jatkuvasti"
|
||||
SlideShow.Transition="Siirtymä"
|
||||
SlideShow.Transition.Cut="Leikkaa"
|
||||
SlideShow.Transition.Fade="Häivytä"
|
||||
SlideShow.Transition.Swipe="Pyyhkäise"
|
||||
SlideShow.Transition.Slide="Liu'uta"
|
||||
SlideShow.PlaybackBehavior="Näkyvyyskäyttäytyminen"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Pysäytä toisto kun lähde ei näy. Käynnistä toisto uudelleen, kun se on taas näkyvissä"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Keskeytä toisto kun lähde ei näy. Jatka toistoa, kun se on taas näkyvissä"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Toista aina, vaikka lähde ei olisi näkyvissä"
|
||||
SlideShow.SlideMode="Leikkaustila"
|
||||
SlideShow.SlideMode.Auto="Automaattinen"
|
||||
SlideShow.SlideMode.Manual="Manuaalinen (Käytä pikanäppäimiä ohjataksesi diashowta)"
|
||||
SlideShow.PlayPause="Toista/Tauko"
|
||||
SlideShow.Restart="Aloita alusta"
|
||||
SlideShow.Stop="Pysäytä"
|
||||
SlideShow.NextSlide="Seuraava dia"
|
||||
SlideShow.PreviousSlide="Edellinen dia"
|
||||
SlideShow.HideWhenDone="Piilota kun diaesitys on valmis"
|
||||
|
||||
ColorSource="Värilähde"
|
||||
ColorSource.Color="Väri"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Fichiers image"
|
|||
SlideShow.CustomSize="Taille Limite/Ratio d'aspect"
|
||||
SlideShow.CustomSize.Auto="Automatique"
|
||||
SlideShow.Randomize="Lecture aléatoire"
|
||||
SlideShow.Loop="Boucle"
|
||||
SlideShow.Transition="Transition"
|
||||
SlideShow.Transition.Cut="Coupure"
|
||||
SlideShow.Transition.Fade="Fondu"
|
||||
SlideShow.Transition.Swipe="Balayage"
|
||||
SlideShow.Transition.Slide="Glissement"
|
||||
SlideShow.PlaybackBehavior="Comportement de Visibilité"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Arrêter si non visible, redémarrer si visible"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Suspendre si non visible, reprendre si visible"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Toujours jouer même lorsqu'elle n'est pas visible"
|
||||
SlideShow.SlideMode="Mode Diapo"
|
||||
SlideShow.SlideMode.Auto="Automatique"
|
||||
SlideShow.SlideMode.Manual="Manuel (utiliser les raccourcis clavier pour contrôler le diapo)"
|
||||
SlideShow.PlayPause="Lire/Pause"
|
||||
SlideShow.Restart="Relancer"
|
||||
SlideShow.Stop="Arrêter"
|
||||
SlideShow.NextSlide="Diapo suivante"
|
||||
SlideShow.PreviousSlide="Diapo précédente"
|
||||
SlideShow.HideWhenDone="Masquer lorsque le diaporama est terminé"
|
||||
|
||||
ColorSource="Source de couleur"
|
||||
ColorSource.Color="Couleur"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Képfájlok"
|
|||
SlideShow.CustomSize="Befoglaló méret/Képarány"
|
||||
SlideShow.CustomSize.Auto="Automatikus"
|
||||
SlideShow.Randomize="Véletlenszerű lejátszás"
|
||||
SlideShow.Loop="Ismétlés"
|
||||
SlideShow.Transition="Átmenet"
|
||||
SlideShow.Transition.Cut="Kivágás"
|
||||
SlideShow.Transition.Fade="Áttűnés"
|
||||
SlideShow.Transition.Swipe="Lapozás"
|
||||
SlideShow.Transition.Slide="Csúsztatás"
|
||||
SlideShow.PlaybackBehavior="Láthatósági opció"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Leállítás, ha nem látható, újraindul, ha látható"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Szüneteltet, ha nem látható, folytatás, ha látható"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Mindig lejátsza, akkor is, ha nem látható"
|
||||
SlideShow.SlideMode="Csúsztatás mód"
|
||||
SlideShow.SlideMode.Auto="Automatikus"
|
||||
SlideShow.SlideMode.Manual="Kézi (Billentyűket használjon az irányításhoz)"
|
||||
SlideShow.PlayPause="Lejátszás/Szünet"
|
||||
SlideShow.Restart="Újraindítás"
|
||||
SlideShow.Stop="Leállítás"
|
||||
SlideShow.NextSlide="Következő dia"
|
||||
SlideShow.PreviousSlide="Előző dia"
|
||||
SlideShow.HideWhenDone="Elrejtés a diavetítés végén"
|
||||
|
||||
ColorSource="Színforrás"
|
||||
ColorSource.Color="Szín"
|
||||
|
|
|
|||
|
|
@ -6,12 +6,28 @@ SlideShow="Presentazione immagini"
|
|||
SlideShow.TransitionSpeed="Velocità di transizione (millisecondi)"
|
||||
SlideShow.SlideTime="Tempo tra le diapositive (millisecondi)"
|
||||
SlideShow.Files="Files Immagini"
|
||||
SlideShow.CustomSize="Dimensioni/proporzioni"
|
||||
SlideShow.CustomSize.Auto="Automatico"
|
||||
SlideShow.Randomize="Randomizzare la riproduzione"
|
||||
SlideShow.Loop="Loop"
|
||||
SlideShow.Transition="Transizione"
|
||||
SlideShow.Transition.Cut="Taglio"
|
||||
SlideShow.Transition.Fade="Dissolvenza"
|
||||
SlideShow.Transition.Swipe="Scorri"
|
||||
SlideShow.Transition.Slide="Scivola"
|
||||
SlideShow.PlaybackBehavior="Comportamento visibilità"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Interrompi quando non visibile, riavvia quando visibile"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pausa quando non visibile, riprendi quando visibile"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Continua sempre anche quando non visibile"
|
||||
SlideShow.SlideMode="Modalità Slide"
|
||||
SlideShow.SlideMode.Auto="Automatico"
|
||||
SlideShow.SlideMode.Manual="Manuale (usa i tasti di scelta rapida per controllare la presentazione)"
|
||||
SlideShow.PlayPause="Play/Pausa"
|
||||
SlideShow.Restart="Riavvia"
|
||||
SlideShow.Stop="Stop"
|
||||
SlideShow.NextSlide="Prossima Slide"
|
||||
SlideShow.PreviousSlide="Slide Precedente"
|
||||
SlideShow.HideWhenDone="Nascondi quando la presentazione è terminata"
|
||||
|
||||
ColorSource="Origine del colore"
|
||||
ColorSource.Color="Colore"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="画像ファイル"
|
|||
SlideShow.CustomSize="バウンディングサイズ/アスペクト比"
|
||||
SlideShow.CustomSize.Auto="自動"
|
||||
SlideShow.Randomize="ランダム再生"
|
||||
SlideShow.Loop="繰り返し"
|
||||
SlideShow.Transition="トランジション"
|
||||
SlideShow.Transition.Cut="カット"
|
||||
SlideShow.Transition.Fade="フェード"
|
||||
SlideShow.Transition.Swipe="スワイプ"
|
||||
SlideShow.Transition.Slide="スライド"
|
||||
SlideShow.PlaybackBehavior="表示の動作"
|
||||
SlideShow.PlaybackBehavior.StopRestart="表示されていないときは停止し、表示されているときは再開する"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="表示されていないときは一時停止し、表示されているときは一時停止しない"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="表示されていないときにも常に再生する"
|
||||
SlideShow.SlideMode="スライドモード"
|
||||
SlideShow.SlideMode.Auto="自動"
|
||||
SlideShow.SlideMode.Manual="手動 (ホットキーを使用してスライドショーを制御する)"
|
||||
SlideShow.PlayPause="再生/一時停止"
|
||||
SlideShow.Restart="再開"
|
||||
SlideShow.Stop="停止"
|
||||
SlideShow.NextSlide="次のスライド"
|
||||
SlideShow.PreviousSlide="前のスライド"
|
||||
SlideShow.HideWhenDone="スライドショーが終わったら非表示にする"
|
||||
|
||||
ColorSource="色ソース"
|
||||
ColorSource.Color="色"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="이미지 파일 형식"
|
|||
SlideShow.CustomSize="경계 크기/화면 비율"
|
||||
SlideShow.CustomSize.Auto="자동"
|
||||
SlideShow.Randomize="무작위 재생"
|
||||
SlideShow.Loop="반복"
|
||||
SlideShow.Transition="전환 방식"
|
||||
SlideShow.Transition.Cut="자르기"
|
||||
SlideShow.Transition.Fade="서서히 사라지기"
|
||||
SlideShow.Transition.Swipe="밀어내기"
|
||||
SlideShow.Transition.Slide="슬라이드"
|
||||
SlideShow.PlaybackBehavior="표시 동작 설정"
|
||||
SlideShow.PlaybackBehavior.StopRestart="보이지 않을 때 중단, 보이면 재시작"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="보이지 않을 때 일시 정지, 보이면 일시 정지 해제"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="보이지 않아도 항상 재생"
|
||||
SlideShow.SlideMode="슬라이드 방식"
|
||||
SlideShow.SlideMode.Auto="자동"
|
||||
SlideShow.SlideMode.Manual="수동 (단축키로 슬라이드 쇼를 제어)"
|
||||
SlideShow.PlayPause="재생/일시 정지"
|
||||
SlideShow.Restart="재시작"
|
||||
SlideShow.Stop="중단"
|
||||
SlideShow.NextSlide="다음 슬라이드"
|
||||
SlideShow.PreviousSlide="이전 슬라이드"
|
||||
SlideShow.HideWhenDone="슬라이드 쇼가 끝나면 숨기기"
|
||||
|
||||
ColorSource="색상 소스"
|
||||
ColorSource.Color="색상"
|
||||
|
|
|
|||
|
|
@ -6,11 +6,31 @@ SlideShow="Lysbildefremvisning"
|
|||
SlideShow.TransitionSpeed="Overgangshastighet (millisekunder)"
|
||||
SlideShow.SlideTime="Tid mellom lysbilder (millisekunder)"
|
||||
SlideShow.Files="Bildefiler"
|
||||
SlideShow.CustomSize="Markeringsboks/størrelsesforhold"
|
||||
SlideShow.CustomSize.Auto="Automatisk"
|
||||
SlideShow.Randomize="Tilfeldig avspilling"
|
||||
SlideShow.Loop="Repeter"
|
||||
SlideShow.Transition="Overgang"
|
||||
SlideShow.Transition.Cut="Kutt"
|
||||
SlideShow.Transition.Fade="Forløpning"
|
||||
SlideShow.Transition.Swipe="Sveip"
|
||||
SlideShow.Transition.Slide="Skyv"
|
||||
SlideShow.PlaybackBehavior="Synlighetsvalg"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Stopp når ikke synlig, spill fra starten når synlig"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Stans når ikke synlig, spill når synlig"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Alltid spill, selv når ikke synlig"
|
||||
SlideShow.SlideMode="Lysbildemodus"
|
||||
SlideShow.SlideMode.Auto="Automatisk"
|
||||
SlideShow.SlideMode.Manual="Manuell (bruk hurtigtaster for å styre lysbildene)"
|
||||
SlideShow.PlayPause="Spill av/pause"
|
||||
SlideShow.Restart="Start på nytt"
|
||||
SlideShow.Stop="Stopp"
|
||||
SlideShow.NextSlide="Neste lysbilde"
|
||||
SlideShow.PreviousSlide="Forrige lysbilde"
|
||||
SlideShow.HideWhenDone="Skjul når lysbildefremvisning er ferdig"
|
||||
|
||||
ColorSource="Fargekilde"
|
||||
ColorSource.Color="Farge"
|
||||
ColorSource.Width="Bredde"
|
||||
ColorSource.Height="Høyde"
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Afbeeldingsbestanden"
|
|||
SlideShow.CustomSize="Randgrootte/Beeldverhouding"
|
||||
SlideShow.CustomSize.Auto="Automatisch"
|
||||
SlideShow.Randomize="Willekeurige Volgorde"
|
||||
SlideShow.Loop="Herhalen"
|
||||
SlideShow.Transition="Overgang"
|
||||
SlideShow.Transition.Cut="Knippen"
|
||||
SlideShow.Transition.Fade="Vervagen"
|
||||
SlideShow.Transition.Swipe="Vegen"
|
||||
SlideShow.Transition.Slide="Slide"
|
||||
SlideShow.PlaybackBehavior="Zichtbaarheidsgedrag"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Stop wanneer niet zichtbaar, herstart wanneer wel zichtbaar"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pauzeer wanneer niet zichtbaar, hervat wanneer wel zichtbaar"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Altijd spelen, zelfs wanneer niet zichtbaar"
|
||||
SlideShow.SlideMode="Diamodus"
|
||||
SlideShow.SlideMode.Auto="Automatisch"
|
||||
SlideShow.SlideMode.Manual="Handmatig (gebruik sneltoetsen om diashow te bedienen)"
|
||||
SlideShow.PlayPause="Afspelen/pauzeren"
|
||||
SlideShow.Restart="Herstarten"
|
||||
SlideShow.Stop="Stop"
|
||||
SlideShow.NextSlide="Volgende dia"
|
||||
SlideShow.PreviousSlide="Vorige dia"
|
||||
SlideShow.HideWhenDone="Verbergen wanneer diashow afgelopen is"
|
||||
|
||||
ColorSource="Kleurbron"
|
||||
ColorSource.Color="Kleur"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Pliki graficzne"
|
|||
SlideShow.CustomSize="Ograniczenie rozmiaru/Proporcje"
|
||||
SlideShow.CustomSize.Auto="Automatycznie"
|
||||
SlideShow.Randomize="Odtwarzanie losowe"
|
||||
SlideShow.Loop="Pętla"
|
||||
SlideShow.Transition="Efekt przejścia"
|
||||
SlideShow.Transition.Cut="Cięcie"
|
||||
SlideShow.Transition.Fade="Zanikanie"
|
||||
SlideShow.Transition.Swipe="Przeciągnięcie"
|
||||
SlideShow.Transition.Slide="Przesunięcie"
|
||||
SlideShow.PlaybackBehavior="Zachowanie"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Zatrzymaj, gdy niewidoczne. Odtwarzaj od początku, gdy widoczne."
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Wstrzymaj, gdy niewidoczne. Wznów, gdy widoczne."
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Odtwarzaj cały czas bez względu na widoczność."
|
||||
SlideShow.SlideMode="Tryb slajdu"
|
||||
SlideShow.SlideMode.Auto="Automatycznie"
|
||||
SlideShow.SlideMode.Manual="Ręcznie (użyj skrótów klawiszowych do kontroli slajdów)"
|
||||
SlideShow.PlayPause="Odtwarzaj/Wstrzymaj"
|
||||
SlideShow.Restart="Zrestartuj"
|
||||
SlideShow.Stop="Zatrzymaj"
|
||||
SlideShow.NextSlide="Następny slajd"
|
||||
SlideShow.PreviousSlide="Poprzedni slajd"
|
||||
SlideShow.HideWhenDone="Ukryj po zakończeniu slajdów"
|
||||
|
||||
ColorSource="Kolor"
|
||||
ColorSource.Color="Kolor"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Arquivos de Imagem"
|
|||
SlideShow.CustomSize="Tamanho Delimitador/Proporção"
|
||||
SlideShow.CustomSize.Auto="Automático"
|
||||
SlideShow.Randomize="Reprodução aleatória"
|
||||
SlideShow.Loop="Loop"
|
||||
SlideShow.Transition="Transição"
|
||||
SlideShow.Transition.Cut="Corte"
|
||||
SlideShow.Transition.Fade="Esmaecer"
|
||||
SlideShow.Transition.Swipe="Arrastar"
|
||||
SlideShow.Transition.Slide="Deslizar"
|
||||
SlideShow.PlaybackBehavior="Comportamento de Visibilidade"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Parar quando não visível, reiniciar quando visível"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pausa quando não visível, resumir quando visível"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Sempre reproduzir, mesmo quando não visível"
|
||||
SlideShow.SlideMode="Modo de slide"
|
||||
SlideShow.SlideMode.Auto="Automático"
|
||||
SlideShow.SlideMode.Manual="Manual (Usar as teclas de atalho para controlar a apresentação)"
|
||||
SlideShow.PlayPause="Reproduzir/Pausar"
|
||||
SlideShow.Restart="Reiniciar"
|
||||
SlideShow.Stop="Parar"
|
||||
SlideShow.NextSlide="Próximo Slide"
|
||||
SlideShow.PreviousSlide="Slide Anterior"
|
||||
SlideShow.HideWhenDone="Esconder quando terminar a apresentação"
|
||||
|
||||
ColorSource="Fonte de Cor"
|
||||
ColorSource.Color="Cor"
|
||||
|
|
|
|||
|
|
@ -9,4 +9,7 @@ SlideShow.Transition="Tranziție"
|
|||
SlideShow.Transition.Cut="Decupare"
|
||||
SlideShow.Transition.Slide="Diapozitiv"
|
||||
|
||||
ColorSource.Color="Culoare"
|
||||
ColorSource.Width="Lățime"
|
||||
ColorSource.Height="Înălțime"
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Файлы изображений"
|
|||
SlideShow.CustomSize="Ограничение размера/Соотношение сторон"
|
||||
SlideShow.CustomSize.Auto="Автоматически"
|
||||
SlideShow.Randomize="Случайное воспроизведение"
|
||||
SlideShow.Loop="Повтор"
|
||||
SlideShow.Transition="Переход"
|
||||
SlideShow.Transition.Cut="Обрезать"
|
||||
SlideShow.Transition.Fade="Затухание"
|
||||
SlideShow.Transition.Swipe="Перемещение"
|
||||
SlideShow.Transition.Slide="Сдвиг"
|
||||
SlideShow.PlaybackBehavior="Поведение видимости"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Всегда воспроизводить, даже если не видимый"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Приостановить если не видимый, возобновить если видимый"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Всегда проигрывать, даже если не видимый"
|
||||
SlideShow.SlideMode="Режим перелистывания"
|
||||
SlideShow.SlideMode.Auto="Автоматический"
|
||||
SlideShow.SlideMode.Manual="Ручной (Используйте горячие клавиши для управления слайд-шоу)"
|
||||
SlideShow.PlayPause="Воспроизвести/Пауза"
|
||||
SlideShow.Restart="Перезапустить"
|
||||
SlideShow.Stop="Остановить"
|
||||
SlideShow.NextSlide="Следующий слайд"
|
||||
SlideShow.PreviousSlide="Предыдущий слайд"
|
||||
SlideShow.HideWhenDone="Скрыть после завершения слайд-шоу"
|
||||
|
||||
ColorSource="Фоновый цвет"
|
||||
ColorSource.Color="Цвет"
|
||||
|
|
|
|||
|
|
@ -6,11 +6,31 @@ SlideShow="Prezentácia obrázkov"
|
|||
SlideShow.TransitionSpeed="Rýchlosť prechodu (v milisekundách)"
|
||||
SlideShow.SlideTime="Čas medzi snímkami (v milisekundách)"
|
||||
SlideShow.Files="Obrázky"
|
||||
SlideShow.CustomSize="Veľkosť/pomer strán"
|
||||
SlideShow.CustomSize.Auto="Automatické"
|
||||
SlideShow.Randomize="Náhodné prehrávanie"
|
||||
SlideShow.Loop="Slučka"
|
||||
SlideShow.Transition="Prechod"
|
||||
SlideShow.Transition.Cut="Strih"
|
||||
SlideShow.Transition.Fade="Miznutie"
|
||||
SlideShow.Transition.Swipe="Potiahnite"
|
||||
SlideShow.Transition.Slide="Posunutie"
|
||||
SlideShow.PlaybackBehavior="Fungovanie podľa viditeľnosti"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Zastaviť, keď nie je viditeľná, reštartovať, keď je viditeľná"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pozastaviť, keď nie je viditeľná, zrušiť pozastavenie, keď je viditeľná"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Vždy prehrávať, aj keď nie je viditeľná"
|
||||
SlideShow.SlideMode="Ovládanie prezentácie"
|
||||
SlideShow.SlideMode.Auto="Automatické"
|
||||
SlideShow.SlideMode.Manual="Manuálne (použite klávesy na ovládanie prezentácie)"
|
||||
SlideShow.PlayPause="Prehrať/Pozastaviť"
|
||||
SlideShow.Restart="Reštartovať"
|
||||
SlideShow.Stop="Zastaviť"
|
||||
SlideShow.NextSlide="Ďalšia snímka"
|
||||
SlideShow.PreviousSlide="Predchádzajúca snímka"
|
||||
SlideShow.HideWhenDone="Skryť, keď prezentácia skončí"
|
||||
|
||||
ColorSource="Farba"
|
||||
ColorSource.Color="Farba"
|
||||
ColorSource.Width="Šírka"
|
||||
ColorSource.Height="Výška"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,13 +6,28 @@ SlideShow="Bildspel"
|
|||
SlideShow.TransitionSpeed="Övergångshastighet (millisekunder)"
|
||||
SlideShow.SlideTime="Tid mellan bilder (millisekunder)"
|
||||
SlideShow.Files="Bildfiler"
|
||||
SlideShow.CustomSize="Avgränsningsstorlek/bildformat"
|
||||
SlideShow.CustomSize.Auto="Automatisk"
|
||||
SlideShow.Randomize="Slumpa uppspelning"
|
||||
SlideShow.Loop="Upprepa"
|
||||
SlideShow.Transition="Övergång"
|
||||
SlideShow.Transition.Cut="Klipp"
|
||||
SlideShow.Transition.Fade="Tona"
|
||||
SlideShow.Transition.Swipe="Svep"
|
||||
SlideShow.Transition.Slide="Glid"
|
||||
SlideShow.PlaybackBehavior="Synlighetsbeteende"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Stoppa när den inte syns, starta om när den syns"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Pausa när den inte syns, återuppta när den syns"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Spela alltid även när den inte syns"
|
||||
SlideShow.SlideMode="Bildspelsläge"
|
||||
SlideShow.SlideMode.Auto="Automatisk"
|
||||
SlideShow.SlideMode.Manual="Manuellt (använd kortkommandon för att styra bildspelet)"
|
||||
SlideShow.PlayPause="Spela/Pausa"
|
||||
SlideShow.Restart="Starta om"
|
||||
SlideShow.Stop="Stoppa"
|
||||
SlideShow.NextSlide="Nästa bild"
|
||||
SlideShow.PreviousSlide="Föregående bild"
|
||||
SlideShow.HideWhenDone="Dölj när bildspelet är färdigt"
|
||||
|
||||
ColorSource="Färgkälla"
|
||||
ColorSource.Color="Färg"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Görüntü Dosyaları"
|
|||
SlideShow.CustomSize="Sınırlayıcı Boyut/En-Boy Oranı"
|
||||
SlideShow.CustomSize.Auto="Otomatik"
|
||||
SlideShow.Randomize="Rastgele Gösterim"
|
||||
SlideShow.Loop="Döngü"
|
||||
SlideShow.Transition="Geçiş"
|
||||
SlideShow.Transition.Cut="Cut"
|
||||
SlideShow.Transition.Fade="Fade"
|
||||
SlideShow.Transition.Swipe="Swipe"
|
||||
SlideShow.Transition.Slide="Slide"
|
||||
SlideShow.PlaybackBehavior="Görünürlük Davranışı"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Görünür olmadığında durdur, görünür olduğunda yeniden başlat"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Görünür olmadığında duraklat, görünür olduğunda oynat"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Görünür olmadığında bile her zaman oynat"
|
||||
SlideShow.SlideMode="Slayt Modu"
|
||||
SlideShow.SlideMode.Auto="Otomatik"
|
||||
SlideShow.SlideMode.Manual="Elle (Slayt gösterisini kontrol etmek için kısayol tuşlarını kullanın)"
|
||||
SlideShow.PlayPause="Oynat/Duraklat"
|
||||
SlideShow.Restart="Yeniden Başlat"
|
||||
SlideShow.Stop="Durdur"
|
||||
SlideShow.NextSlide="Sonraki Slayt"
|
||||
SlideShow.PreviousSlide="Önceki Slayt"
|
||||
SlideShow.HideWhenDone="Slayt gösterisi tamamlandığında gizle"
|
||||
|
||||
ColorSource="Renk Kaynağı"
|
||||
ColorSource.Color="Renk"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
ImageInput="Зображення"
|
||||
File="Файл зображення"
|
||||
UnloadWhenNotShowing="Вивантажи зображення, коли не відображається"
|
||||
UnloadWhenNotShowing="Вивантажувати зображення, коли воно не виводиться"
|
||||
|
||||
SlideShow="Слайд-шоу"
|
||||
SlideShow.TransitionSpeed="Тривалість відео-переходу (мілісекунд)"
|
||||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="Файли зображень"
|
|||
SlideShow.CustomSize="Розмір рамки/пропорції"
|
||||
SlideShow.CustomSize.Auto="Автоматично"
|
||||
SlideShow.Randomize="Випадкове відтворення"
|
||||
SlideShow.Loop="Циклічно відтворювати"
|
||||
SlideShow.Transition="Відео-перехід"
|
||||
SlideShow.Transition.Cut="Cut"
|
||||
SlideShow.Transition.Fade="Fade"
|
||||
SlideShow.Transition.Swipe="Swipe"
|
||||
SlideShow.Transition.Slide="Slide"
|
||||
SlideShow.PlaybackBehavior="Видимість та відтворення"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Зупинити, коли не видимий. Грати з початку, коли видимий"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Призупинити, коли не видимий. Грати далі, коли видимий"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Завжди грати навіть тоді, коли не видимий"
|
||||
SlideShow.SlideMode="Режим слайдів"
|
||||
SlideShow.SlideMode.Auto="Автоматично"
|
||||
SlideShow.SlideMode.Manual="Вручну (використовувати Гарячі клавіші для контролю)"
|
||||
SlideShow.PlayPause="Відтворення / Пауза"
|
||||
SlideShow.Restart="Грати з початку"
|
||||
SlideShow.Stop="Зупинити"
|
||||
SlideShow.NextSlide="Наступний слайд"
|
||||
SlideShow.PreviousSlide="Попередній слайд"
|
||||
SlideShow.HideWhenDone="Не показувати джерело, коли відтворення слайд-шоу завершено"
|
||||
|
||||
ColorSource="Щільний колір"
|
||||
ColorSource.Color="Колір"
|
||||
|
|
|
|||
36
plugins/image-source/data/locale/vi-VN.ini
Normal file
36
plugins/image-source/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
ImageInput="Hình ảnh"
|
||||
File="Tập tin hình ảnh"
|
||||
UnloadWhenNotShowing="Tải lên hình ảnh khi không hiển thị"
|
||||
|
||||
SlideShow="Trình chiếu hình ảnh"
|
||||
SlideShow.TransitionSpeed="Tốc độ chuyển cảnh (mili giây)"
|
||||
SlideShow.SlideTime="Thời gian giữa các slide (mili giây)"
|
||||
SlideShow.Files="Tập tin hình ảnh"
|
||||
SlideShow.CustomSize="Kích thước / Tỷ lệ co dãn"
|
||||
SlideShow.CustomSize.Auto="Tự động"
|
||||
SlideShow.Randomize="Phát lại ngẫu nhiên"
|
||||
SlideShow.Loop="Lặp lại"
|
||||
SlideShow.Transition="Chuyển cảnh"
|
||||
SlideShow.Transition.Cut="Cắt"
|
||||
SlideShow.Transition.Fade="Mờ dần"
|
||||
SlideShow.Transition.Swipe="Vuốt"
|
||||
SlideShow.Transition.Slide="Trượt"
|
||||
SlideShow.PlaybackBehavior="Hành vi hiển thị"
|
||||
SlideShow.PlaybackBehavior.StopRestart="Dừng khi không hiển thị, khởi động lại khi hiển thị"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="Tạm dừng khi không hiển thị, bỏ tạm dừng khi hiển thị"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="Luôn luôn phát ngay cả khi không hiển thị"
|
||||
SlideShow.SlideMode="Chế độ Slide"
|
||||
SlideShow.SlideMode.Auto="Tự động"
|
||||
SlideShow.SlideMode.Manual="Bằng tay (Dùng phím nóng để điều khiển trình chiếu)"
|
||||
SlideShow.PlayPause="Phát/Tạm dừng"
|
||||
SlideShow.Restart="Khởi động lại"
|
||||
SlideShow.Stop="Dừng"
|
||||
SlideShow.NextSlide="Slide kế"
|
||||
SlideShow.PreviousSlide="Slide trước"
|
||||
SlideShow.HideWhenDone="Ẩn khi trình chiếu xong"
|
||||
|
||||
ColorSource="Nguồn màu"
|
||||
ColorSource.Color="Màu"
|
||||
ColorSource.Width="Chiều rộng"
|
||||
ColorSource.Height="Chiều cao"
|
||||
|
||||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="图像文件"
|
|||
SlideShow.CustomSize="边框大小/高宽比"
|
||||
SlideShow.CustomSize.Auto="自动"
|
||||
SlideShow.Randomize="随机播放"
|
||||
SlideShow.Loop="循环"
|
||||
SlideShow.Transition="转换"
|
||||
SlideShow.Transition.Cut="剪切"
|
||||
SlideShow.Transition.Fade="淡出"
|
||||
SlideShow.Transition.Swipe="滑动"
|
||||
SlideShow.Transition.Slide="幻灯片"
|
||||
SlideShow.PlaybackBehavior="可见性的行为"
|
||||
SlideShow.PlaybackBehavior.StopRestart="不可见时停止, 可见时重新开始"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="不可见时暂停, 可见时取消暂停"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="即使在不可见时也保持播放"
|
||||
SlideShow.SlideMode="幻灯片模式"
|
||||
SlideShow.SlideMode.Auto="自动"
|
||||
SlideShow.SlideMode.Manual="手动 (使用热键来控制幻灯片)"
|
||||
SlideShow.PlayPause="播放/暂停"
|
||||
SlideShow.Restart="重新开始"
|
||||
SlideShow.Stop="停止"
|
||||
SlideShow.NextSlide="下一张幻灯片"
|
||||
SlideShow.PreviousSlide="上一张幻灯片"
|
||||
SlideShow.HideWhenDone="幻灯片完成时隐藏"
|
||||
|
||||
ColorSource="色源"
|
||||
ColorSource.Color="色彩"
|
||||
|
|
|
|||
|
|
@ -9,11 +9,25 @@ SlideShow.Files="圖片檔案"
|
|||
SlideShow.CustomSize="邊框大小長寬比"
|
||||
SlideShow.CustomSize.Auto="自動"
|
||||
SlideShow.Randomize="隨機播放"
|
||||
SlideShow.Loop="循環播放"
|
||||
SlideShow.Transition="變更特效"
|
||||
SlideShow.Transition.Cut="直接變更"
|
||||
SlideShow.Transition.Fade="淡入淡出"
|
||||
SlideShow.Transition.Swipe="滑出"
|
||||
SlideShow.Transition.Slide="推出"
|
||||
SlideShow.PlaybackBehavior="播放行為"
|
||||
SlideShow.PlaybackBehavior.StopRestart="不可見時停止,可見時重新開始"
|
||||
SlideShow.PlaybackBehavior.PauseUnpause="不可見時暫停,可見時取消暫停"
|
||||
SlideShow.PlaybackBehavior.AlwaysPlay="即使不可見一樣播放"
|
||||
SlideShow.SlideMode="投影片模式"
|
||||
SlideShow.SlideMode.Auto="自動"
|
||||
SlideShow.SlideMode.Manual="手動 (使用熱鍵來控制幻燈片)"
|
||||
SlideShow.PlayPause="播放/暫停"
|
||||
SlideShow.Restart="重新開始"
|
||||
SlideShow.Stop="停止"
|
||||
SlideShow.NextSlide="下一張投影片"
|
||||
SlideShow.PreviousSlide="前一張投影片"
|
||||
SlideShow.HideWhenDone="完成時隱藏"
|
||||
|
||||
ColorSource="色彩來源"
|
||||
ColorSource.Color="色彩"
|
||||
|
|
|
|||
|
|
@ -15,7 +15,16 @@
|
|||
#define S_SLIDE_TIME "slide_time"
|
||||
#define S_TRANSITION "transition"
|
||||
#define S_RANDOMIZE "randomize"
|
||||
#define S_LOOP "loop"
|
||||
#define S_HIDE "hide"
|
||||
#define S_FILES "files"
|
||||
#define S_BEHAVIOR "playback_behavior"
|
||||
#define S_BEHAVIOR_STOP_RESTART "stop_restart"
|
||||
#define S_BEHAVIOR_PAUSE_UNPAUSE "pause_unpause"
|
||||
#define S_BEHAVIOR_ALWAYS_PLAY "always_play"
|
||||
#define S_MODE "slide_mode"
|
||||
#define S_MODE_AUTO "mode_auto"
|
||||
#define S_MODE_MANUAL "mode_manual"
|
||||
|
||||
#define TR_CUT "cut"
|
||||
#define TR_FADE "fade"
|
||||
|
|
@ -29,7 +38,16 @@
|
|||
#define T_SLIDE_TIME T_("SlideTime")
|
||||
#define T_TRANSITION T_("Transition")
|
||||
#define T_RANDOMIZE T_("Randomize")
|
||||
#define T_LOOP T_("Loop")
|
||||
#define T_HIDE T_("HideWhenDone")
|
||||
#define T_FILES T_("Files")
|
||||
#define T_BEHAVIOR T_("PlaybackBehavior")
|
||||
#define T_BEHAVIOR_STOP_RESTART T_("PlaybackBehavior.StopRestart")
|
||||
#define T_BEHAVIOR_PAUSE_UNPAUSE T_("PlaybackBehavior.PauseUnpause")
|
||||
#define T_BEHAVIOR_ALWAYS_PLAY T_("PlaybackBehavior.AlwaysPlay")
|
||||
#define T_MODE T_("SlideMode")
|
||||
#define T_MODE_AUTO T_("SlideMode.Auto")
|
||||
#define T_MODE_MANUAL T_("SlideMode.Manual")
|
||||
|
||||
#define T_TR_(text) obs_module_text("SlideShow.Transition." text)
|
||||
#define T_TR_CUT T_TR_("Cut")
|
||||
|
|
@ -44,10 +62,25 @@ struct image_file_data {
|
|||
obs_source_t *source;
|
||||
};
|
||||
|
||||
enum behavior {
|
||||
BEHAVIOR_STOP_RESTART,
|
||||
BEHAVIOR_PAUSE_UNPAUSE,
|
||||
BEHAVIOR_ALWAYS_PLAY,
|
||||
};
|
||||
|
||||
struct slideshow {
|
||||
obs_source_t *source;
|
||||
|
||||
bool randomize;
|
||||
bool loop;
|
||||
bool restart_on_activate;
|
||||
bool pause_on_deactivate;
|
||||
bool restart;
|
||||
bool manual;
|
||||
bool hide;
|
||||
bool use_cut;
|
||||
bool paused;
|
||||
bool stop;
|
||||
float slide_time;
|
||||
uint32_t tr_speed;
|
||||
const char *tr_name;
|
||||
|
|
@ -61,6 +94,14 @@ struct slideshow {
|
|||
|
||||
pthread_mutex_t mutex;
|
||||
DARRAY(struct image_file_data) files;
|
||||
|
||||
enum behavior behavior;
|
||||
|
||||
obs_hotkey_id play_pause_hotkey;
|
||||
obs_hotkey_id restart_hotkey;
|
||||
obs_hotkey_id stop_hotkey;
|
||||
obs_hotkey_id next_hotkey;
|
||||
obs_hotkey_id prev_hotkey;
|
||||
};
|
||||
|
||||
static obs_source_t *get_transition(struct slideshow *ss)
|
||||
|
|
@ -179,6 +220,33 @@ static bool valid_extension(const char *ext)
|
|||
astrcmpi(ext, ".gif") == 0;
|
||||
}
|
||||
|
||||
static inline bool item_valid(struct slideshow *ss)
|
||||
{
|
||||
return ss->files.num && ss->cur_item < ss->files.num;
|
||||
}
|
||||
|
||||
static void do_transition(void *data, bool to_null)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
bool valid = item_valid(ss);
|
||||
|
||||
if (valid && ss->use_cut)
|
||||
obs_transition_set(ss->transition,
|
||||
ss->files.array[ss->cur_item].source);
|
||||
|
||||
else if (valid && !to_null)
|
||||
obs_transition_start(ss->transition,
|
||||
OBS_TRANSITION_MODE_AUTO,
|
||||
ss->tr_speed,
|
||||
ss->files.array[ss->cur_item].source);
|
||||
|
||||
else
|
||||
obs_transition_start(ss->transition,
|
||||
OBS_TRANSITION_MODE_AUTO,
|
||||
ss->tr_speed,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void ss_update(void *data, obs_data_t *settings)
|
||||
{
|
||||
DARRAY(struct image_file_data) new_files;
|
||||
|
|
@ -193,12 +261,27 @@ static void ss_update(void *data, obs_data_t *settings)
|
|||
uint32_t cx = 0;
|
||||
uint32_t cy = 0;
|
||||
size_t count;
|
||||
const char *behavior;
|
||||
const char *mode;
|
||||
|
||||
/* ------------------------------------- */
|
||||
/* get settings data */
|
||||
|
||||
da_init(new_files);
|
||||
|
||||
behavior = obs_data_get_string(settings, S_BEHAVIOR);
|
||||
|
||||
if (astrcmpi(behavior, S_BEHAVIOR_PAUSE_UNPAUSE) == 0)
|
||||
ss->behavior = BEHAVIOR_PAUSE_UNPAUSE;
|
||||
else if (astrcmpi(behavior, S_BEHAVIOR_ALWAYS_PLAY) == 0)
|
||||
ss->behavior = BEHAVIOR_ALWAYS_PLAY;
|
||||
else /* S_BEHAVIOR_STOP_RESTART */
|
||||
ss->behavior = BEHAVIOR_STOP_RESTART;
|
||||
|
||||
mode = obs_data_get_string(settings, S_MODE);
|
||||
|
||||
ss->manual = (astrcmpi(mode, S_MODE_MANUAL) == 0);
|
||||
|
||||
tr_name = obs_data_get_string(settings, S_TRANSITION);
|
||||
if (astrcmpi(tr_name, TR_CUT) == 0)
|
||||
tr_name = "cut_transition";
|
||||
|
|
@ -210,6 +293,8 @@ static void ss_update(void *data, obs_data_t *settings)
|
|||
tr_name = "fade_transition";
|
||||
|
||||
ss->randomize = obs_data_get_bool(settings, S_RANDOMIZE);
|
||||
ss->loop = obs_data_get_bool(settings, S_LOOP);
|
||||
ss->hide = obs_data_get_bool(settings, S_HIDE);
|
||||
|
||||
if (!ss->tr_name || strcmp(tr_name, ss->tr_name) != 0)
|
||||
new_tr = obs_source_create_private(tr_name, NULL, NULL);
|
||||
|
|
@ -347,13 +432,139 @@ static void ss_update(void *data, obs_data_t *settings)
|
|||
if (new_tr)
|
||||
obs_source_add_active_child(ss->source, new_tr);
|
||||
if (ss->files.num)
|
||||
obs_transition_start(ss->transition, OBS_TRANSITION_MODE_AUTO,
|
||||
ss->tr_speed,
|
||||
ss->files.array[ss->cur_item].source);
|
||||
do_transition(ss, false);
|
||||
|
||||
obs_data_array_release(array);
|
||||
}
|
||||
|
||||
static void ss_play_pause(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
ss->paused = !ss->paused;
|
||||
ss->manual = ss->paused;
|
||||
}
|
||||
|
||||
static void ss_restart(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
ss->elapsed = 0.0f;
|
||||
ss->cur_item = 0;
|
||||
|
||||
obs_transition_set(ss->transition,
|
||||
ss->files.array[ss->cur_item].source);
|
||||
|
||||
ss->stop = false;
|
||||
ss->paused = false;
|
||||
}
|
||||
|
||||
static void ss_stop(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
ss->elapsed = 0.0f;
|
||||
ss->cur_item = 0;
|
||||
|
||||
do_transition(ss, true);
|
||||
ss->stop = true;
|
||||
ss->paused = false;
|
||||
}
|
||||
|
||||
static void ss_next_slide(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (!ss->files.num)
|
||||
return;
|
||||
|
||||
if (++ss->cur_item >= ss->files.num)
|
||||
ss->cur_item = 0;
|
||||
|
||||
do_transition(ss, false);
|
||||
}
|
||||
|
||||
static void ss_previous_slide(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (!ss->files.num)
|
||||
return;
|
||||
|
||||
if (ss->cur_item == 0)
|
||||
ss->cur_item = ss->files.num - 1;
|
||||
else
|
||||
--ss->cur_item;
|
||||
|
||||
do_transition(ss, false);
|
||||
}
|
||||
|
||||
static void play_pause_hotkey(void *data, obs_hotkey_id id,
|
||||
obs_hotkey_t *hotkey, bool pressed)
|
||||
{
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(hotkey);
|
||||
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (pressed && obs_source_active(ss->source))
|
||||
ss_play_pause(ss);
|
||||
}
|
||||
|
||||
static void restart_hotkey(void *data, obs_hotkey_id id,
|
||||
obs_hotkey_t *hotkey, bool pressed)
|
||||
{
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(hotkey);
|
||||
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (pressed && obs_source_active(ss->source))
|
||||
ss_restart(ss);
|
||||
}
|
||||
|
||||
static void stop_hotkey(void *data, obs_hotkey_id id,
|
||||
obs_hotkey_t *hotkey, bool pressed)
|
||||
{
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(hotkey);
|
||||
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (pressed && obs_source_active(ss->source))
|
||||
ss_stop(ss);
|
||||
}
|
||||
|
||||
static void next_slide_hotkey(void *data, obs_hotkey_id id,
|
||||
obs_hotkey_t *hotkey, bool pressed)
|
||||
{
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(hotkey);
|
||||
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (!ss->manual)
|
||||
return;
|
||||
|
||||
if (pressed && obs_source_active(ss->source))
|
||||
ss_next_slide(ss);
|
||||
}
|
||||
|
||||
static void previous_slide_hotkey(void *data, obs_hotkey_id id,
|
||||
obs_hotkey_t *hotkey, bool pressed)
|
||||
{
|
||||
UNUSED_PARAMETER(id);
|
||||
UNUSED_PARAMETER(hotkey);
|
||||
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (!ss->manual)
|
||||
return;
|
||||
|
||||
if (pressed && obs_source_active(ss->source))
|
||||
ss_previous_slide(ss);
|
||||
}
|
||||
|
||||
static void ss_destroy(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
|
@ -367,8 +578,38 @@ static void ss_destroy(void *data)
|
|||
static void *ss_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
struct slideshow *ss = bzalloc(sizeof(*ss));
|
||||
|
||||
ss->source = source;
|
||||
|
||||
ss->manual = false;
|
||||
ss->paused = false;
|
||||
ss->stop = false;
|
||||
|
||||
ss->play_pause_hotkey = obs_hotkey_register_source(source,
|
||||
"SlideShow.PlayPause",
|
||||
obs_module_text("SlideShow.PlayPause"),
|
||||
play_pause_hotkey, ss);
|
||||
|
||||
ss->restart_hotkey = obs_hotkey_register_source(source,
|
||||
"SlideShow.Restart",
|
||||
obs_module_text("SlideShow.Restart"),
|
||||
restart_hotkey, ss);
|
||||
|
||||
ss->stop_hotkey = obs_hotkey_register_source(source,
|
||||
"SlideShow.Stop",
|
||||
obs_module_text("SlideShow.Stop"),
|
||||
stop_hotkey, ss);
|
||||
|
||||
ss->prev_hotkey = obs_hotkey_register_source(source,
|
||||
"SlideShow.NextSlide",
|
||||
obs_module_text("SlideShow.NextSlide"),
|
||||
next_slide_hotkey, ss);
|
||||
|
||||
ss->prev_hotkey = obs_hotkey_register_source(source,
|
||||
"SlideShow.PreviousSlide",
|
||||
obs_module_text("SlideShow.PreviousSlide"),
|
||||
previous_slide_hotkey, ss);
|
||||
|
||||
pthread_mutex_init_value(&ss->mutex);
|
||||
if (pthread_mutex_init(&ss->mutex, NULL) != 0)
|
||||
goto error;
|
||||
|
|
@ -403,10 +644,33 @@ static void ss_video_tick(void *data, float seconds)
|
|||
if (!ss->transition || !ss->slide_time)
|
||||
return;
|
||||
|
||||
if (ss->restart_on_activate && !ss->randomize && ss->use_cut) {
|
||||
ss->elapsed = 0.0f;
|
||||
ss->cur_item = 0;
|
||||
do_transition(ss, false);
|
||||
ss->restart_on_activate = false;
|
||||
ss->use_cut = false;
|
||||
ss->stop = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (ss->pause_on_deactivate || ss->manual || ss->stop || ss->paused)
|
||||
return;
|
||||
|
||||
ss->elapsed += seconds;
|
||||
|
||||
if (ss->elapsed > ss->slide_time) {
|
||||
ss->elapsed -= ss->slide_time;
|
||||
|
||||
if (!ss->loop && ss->cur_item == ss->files.num - 1) {
|
||||
if (ss->hide)
|
||||
do_transition(ss, true);
|
||||
else
|
||||
do_transition(ss, false);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (ss->randomize) {
|
||||
size_t next = ss->cur_item;
|
||||
if (ss->files.num > 1) {
|
||||
|
|
@ -420,9 +684,7 @@ static void ss_video_tick(void *data, float seconds)
|
|||
}
|
||||
|
||||
if (ss->files.num)
|
||||
obs_transition_start(ss->transition,
|
||||
OBS_TRANSITION_MODE_AUTO, ss->tr_speed,
|
||||
ss->files.array[ss->cur_item].source);
|
||||
do_transition(ss, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -506,6 +768,10 @@ static void ss_defaults(obs_data_t *settings)
|
|||
obs_data_set_default_int(settings, S_SLIDE_TIME, 8000);
|
||||
obs_data_set_default_int(settings, S_TR_SPEED, 700);
|
||||
obs_data_set_default_string(settings, S_CUSTOM_SIZE, T_CUSTOM_SIZE_AUTO);
|
||||
obs_data_set_default_string(settings, S_BEHAVIOR,
|
||||
S_BEHAVIOR_ALWAYS_PLAY);
|
||||
obs_data_set_default_string(settings, S_MODE, S_MODE_AUTO);
|
||||
obs_data_set_default_bool(settings, S_LOOP, true);
|
||||
}
|
||||
|
||||
static const char *file_filter =
|
||||
|
|
@ -538,6 +804,20 @@ static obs_properties_t *ss_properties(void *data)
|
|||
|
||||
/* ----------------- */
|
||||
|
||||
p = obs_properties_add_list(ppts, S_BEHAVIOR, T_BEHAVIOR,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_list_add_string(p, T_BEHAVIOR_ALWAYS_PLAY,
|
||||
S_BEHAVIOR_ALWAYS_PLAY);
|
||||
obs_property_list_add_string(p, T_BEHAVIOR_STOP_RESTART,
|
||||
S_BEHAVIOR_STOP_RESTART);
|
||||
obs_property_list_add_string(p, T_BEHAVIOR_PAUSE_UNPAUSE,
|
||||
S_BEHAVIOR_PAUSE_UNPAUSE);
|
||||
|
||||
p = obs_properties_add_list(ppts, S_MODE, T_MODE,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_list_add_string(p, T_MODE_AUTO, S_MODE_AUTO);
|
||||
obs_property_list_add_string(p, T_MODE_MANUAL, S_MODE_MANUAL);
|
||||
|
||||
p = obs_properties_add_list(ppts, S_TRANSITION, T_TRANSITION,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_list_add_string(p, T_TR_CUT, TR_CUT);
|
||||
|
|
@ -549,6 +829,8 @@ static obs_properties_t *ss_properties(void *data)
|
|||
50, 3600000, 50);
|
||||
obs_properties_add_int(ppts, S_TR_SPEED, T_TR_SPEED,
|
||||
0, 3600000, 50);
|
||||
obs_properties_add_bool(ppts, S_LOOP, T_LOOP);
|
||||
obs_properties_add_bool(ppts, S_HIDE, T_HIDE);
|
||||
obs_properties_add_bool(ppts, S_RANDOMIZE, T_RANDOMIZE);
|
||||
|
||||
p = obs_properties_add_list(ppts, S_CUSTOM_SIZE, T_CUSTOM_SIZE,
|
||||
|
|
@ -585,6 +867,26 @@ static obs_properties_t *ss_properties(void *data)
|
|||
return ppts;
|
||||
}
|
||||
|
||||
static void ss_activate(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (ss->behavior == BEHAVIOR_STOP_RESTART) {
|
||||
ss->restart_on_activate = true;
|
||||
ss->use_cut = true;
|
||||
} else if (ss->behavior == BEHAVIOR_PAUSE_UNPAUSE) {
|
||||
ss->pause_on_deactivate = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void ss_deactivate(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
|
||||
if (ss->behavior == BEHAVIOR_PAUSE_UNPAUSE)
|
||||
ss->pause_on_deactivate = true;
|
||||
}
|
||||
|
||||
struct obs_source_info slideshow_info = {
|
||||
.id = "slideshow",
|
||||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
|
|
@ -595,6 +897,8 @@ struct obs_source_info slideshow_info = {
|
|||
.create = ss_create,
|
||||
.destroy = ss_destroy,
|
||||
.update = ss_update,
|
||||
.activate = ss_activate,
|
||||
.deactivate = ss_deactivate,
|
||||
.video_render = ss_video_render,
|
||||
.video_tick = ss_video_tick,
|
||||
.audio_render = ss_audio_render,
|
||||
|
|
|
|||
|
|
@ -312,8 +312,6 @@ obs_properties_t * alsa_get_properties(void *unused)
|
|||
|
||||
obs_property_list_add_string(devices, descr, name);
|
||||
|
||||
obs_property_list_add_string(devices, "Custom", "__custom__");
|
||||
|
||||
next:
|
||||
if (name != NULL)
|
||||
free(name), name = NULL;
|
||||
|
|
@ -326,6 +324,8 @@ obs_properties_t * alsa_get_properties(void *unused)
|
|||
|
||||
++hint;
|
||||
}
|
||||
obs_property_list_add_string(devices, "Custom", "__custom__");
|
||||
|
||||
snd_device_name_free_hint(hints);
|
||||
|
||||
return props;
|
||||
|
|
@ -622,13 +622,13 @@ enum audio_format _alsa_to_obs_audio_format(snd_pcm_format_t format)
|
|||
enum speaker_layout _alsa_channels_to_obs_speakers(unsigned int channels)
|
||||
{
|
||||
switch(channels) {
|
||||
case 1: return SPEAKERS_MONO;
|
||||
case 2: return SPEAKERS_STEREO;
|
||||
case 3: return SPEAKERS_2POINT1;
|
||||
case 4: return SPEAKERS_SURROUND;
|
||||
case 5: return SPEAKERS_4POINT1;
|
||||
case 6: return SPEAKERS_5POINT1;
|
||||
case 8: return SPEAKERS_7POINT1;
|
||||
case 1: return SPEAKERS_MONO;
|
||||
case 2: return SPEAKERS_STEREO;
|
||||
case 3: return SPEAKERS_2POINT1;
|
||||
case 4: return SPEAKERS_4POINT0;
|
||||
case 5: return SPEAKERS_4POINT1;
|
||||
case 6: return SPEAKERS_5POINT1;
|
||||
case 8: return SPEAKERS_7POINT1;
|
||||
}
|
||||
|
||||
return SPEAKERS_UNKNOWN;
|
||||
|
|
|
|||
3
plugins/linux-alsa/data/locale/el-GR.ini
Normal file
3
plugins/linux-alsa/data/locale/el-GR.ini
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
AlsaInput="Συσκευή καταγραφής ήχου (ALSA)"
|
||||
Device="Συσκευή"
|
||||
|
||||
|
|
@ -1,16 +1,16 @@
|
|||
X11SharedMemoryScreenInput="Indfang skærm (XSHM)"
|
||||
X11SharedMemoryScreenInput="Skærmoptagelse (XSHM)"
|
||||
Screen="Skærm"
|
||||
CaptureCursor="Indfang markøren"
|
||||
AdvancedSettings="Avancerede indstillinger"
|
||||
CaptureCursor="Optag markør"
|
||||
AdvancedSettings="Avancerede Indstillinger"
|
||||
XServer="X Server"
|
||||
XCCapture="Indfang vindue (Xcomposite)"
|
||||
XCCapture="Vinduesoptagelse (Xcomposite)"
|
||||
Window="Vindue"
|
||||
CropTop="Beskær top (pixels)"
|
||||
CropLeft="Beskær venstre (pixels)"
|
||||
CropRight="Beskær højre (pixels)"
|
||||
CropBottom="Beskær bund (pixels)"
|
||||
SwapRedBlue="Swap rød og blå"
|
||||
LockX="Lås X server ved optagelse"
|
||||
IncludeXBorder="Inkluder X kant"
|
||||
ExcludeAlpha="Brug alpha-mindre tekstur format (Mesa løsning)"
|
||||
SwapRedBlue="Ombyt rød og blå"
|
||||
LockX="Lås X server under optagelse"
|
||||
IncludeXBorder="Inkluder X-kant"
|
||||
ExcludeAlpha="Benyt alpha-fri teksturformat (Mesa løsning)"
|
||||
|
||||
|
|
|
|||
|
|
@ -12,4 +12,5 @@ CropBottom="Περικοπή Κάτω (pixels)"
|
|||
SwapRedBlue="Ανταλλαγή κόκκινου και μπλέ"
|
||||
LockX="Κλείδωμα X server κατά την σύλληψη"
|
||||
IncludeXBorder="Περίλαβε το περίγραμμα του X"
|
||||
ExcludeAlpha="Χρησιμοποίηση της μορφής υφής χωρίς άλφα (Λύση για Mesa)"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ Screen="화면"
|
|||
CaptureCursor="커서 캡쳐"
|
||||
AdvancedSettings="고급 설정"
|
||||
XServer="X 서버"
|
||||
XCCapture="윈도우 캡쳐(Xcomposite)"
|
||||
XCCapture="윈도우 캡쳐 (Xcomposite)"
|
||||
Window="윈도우"
|
||||
CropTop="위쪽 자르기 (픽셀)"
|
||||
CropLeft="왼쪽 자르기 (픽셀)"
|
||||
|
|
|
|||
|
|
@ -12,4 +12,5 @@ CropBottom="Orezanie dole (pixely)"
|
|||
SwapRedBlue="Vymeniť červenú a modrú"
|
||||
LockX="Zamknúť X server počas snímania"
|
||||
IncludeXBorder="Zahŕňajú X okraj"
|
||||
ExcludeAlpha="Použiť formát textúry bez alpha kanálu (riešenie pre Mesa problém)"
|
||||
|
||||
|
|
|
|||
|
|
@ -267,6 +267,9 @@ namespace XCompcap
|
|||
if (ev.type == Expose)
|
||||
changedWindows.insert(ev.xexpose.window);
|
||||
|
||||
if (ev.type == VisibilityNotify)
|
||||
changedWindows.insert(ev.xvisibility.window);
|
||||
|
||||
if (ev.type == DestroyNotify)
|
||||
changedWindows.insert(ev.xdestroywindow.event);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -318,7 +318,10 @@ void XCompcapMain::updateSettings(obs_data_t *settings)
|
|||
}
|
||||
|
||||
if (p->win)
|
||||
XSelectInput(xdisp, p->win, StructureNotifyMask | ExposureMask);
|
||||
XSelectInput(xdisp, p->win,
|
||||
StructureNotifyMask
|
||||
| ExposureMask
|
||||
| VisibilityChangeMask);
|
||||
XSync(xdisp, 0);
|
||||
|
||||
XWindowAttributes attr;
|
||||
|
|
@ -458,6 +461,18 @@ void XCompcapMain::updateSettings(obs_data_t *settings)
|
|||
glXBindTexImageEXT(xdisp, p->glxpixmap, GLX_FRONT_LEFT_EXT, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
if (!p->windowName.empty()) {
|
||||
blog(LOG_INFO, "[window-capture: '%s'] update settings:\n"
|
||||
"\ttitle: %s\n"
|
||||
"\tclass: %s",
|
||||
obs_source_get_name(p->source),
|
||||
XCompcap::getWindowName(p->win).c_str(),
|
||||
XCompcap::getWindowClass(p->win).c_str());
|
||||
blog(LOG_DEBUG, "\n"
|
||||
"\tid: %s",
|
||||
std::to_string((long long)p->win).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void XCompcapMain::tick(float seconds)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
StartJACKServer="Bắt đầu JACK server"
|
||||
Channels="Số lượng các kênh"
|
||||
JACKInput="Đầu vào JACK Client"
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@ static enum speaker_layout jack_channels_to_obs_speakers(uint_fast32_t channels)
|
|||
case 1: return SPEAKERS_MONO;
|
||||
case 2: return SPEAKERS_STEREO;
|
||||
case 3: return SPEAKERS_2POINT1;
|
||||
case 4: return SPEAKERS_SURROUND;
|
||||
case 5: return SPEAKERS_4POINT1;
|
||||
case 6: return SPEAKERS_5POINT1;
|
||||
/* What should we do with 7 channels? */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
PulseInput="오디오 입력 캡쳐(PulseAudio)"
|
||||
PulseInput="오디오 입력 캡쳐 (PulseAudio)"
|
||||
PulseOutput="오디오 출력 캡쳐(PulseAudio)"
|
||||
Device="장치"
|
||||
|
||||
|
|
|
|||
4
plugins/linux-pulseaudio/data/locale/vi-VN.ini
Normal file
4
plugins/linux-pulseaudio/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
PulseInput="Thu âm đầu vào (PulseAudio)"
|
||||
PulseOutput="Thu âm đầu ra (PulseAudio)"
|
||||
Device="Thiết bị"
|
||||
|
||||
|
|
@ -33,6 +33,7 @@ struct pulse_data {
|
|||
|
||||
/* user settings */
|
||||
char *device;
|
||||
bool input;
|
||||
|
||||
/* server info */
|
||||
enum speaker_layout speakers;
|
||||
|
|
@ -80,18 +81,73 @@ static enum speaker_layout pulse_channels_to_obs_speakers(
|
|||
uint_fast32_t channels)
|
||||
{
|
||||
switch(channels) {
|
||||
case 1: return SPEAKERS_MONO;
|
||||
case 2: return SPEAKERS_STEREO;
|
||||
case 3: return SPEAKERS_2POINT1;
|
||||
case 4: return SPEAKERS_SURROUND;
|
||||
case 5: return SPEAKERS_4POINT1;
|
||||
case 6: return SPEAKERS_5POINT1;
|
||||
case 8: return SPEAKERS_7POINT1;
|
||||
case 1: return SPEAKERS_MONO;
|
||||
case 2: return SPEAKERS_STEREO;
|
||||
case 3: return SPEAKERS_2POINT1;
|
||||
case 4: return SPEAKERS_4POINT0;
|
||||
case 5: return SPEAKERS_4POINT1;
|
||||
case 6: return SPEAKERS_5POINT1;
|
||||
case 8: return SPEAKERS_7POINT1;
|
||||
}
|
||||
|
||||
return SPEAKERS_UNKNOWN;
|
||||
}
|
||||
|
||||
static pa_channel_map pulse_channel_map(enum speaker_layout layout)
|
||||
{
|
||||
pa_channel_map ret;
|
||||
|
||||
ret.map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
ret.map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
ret.map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
ret.map[3] = PA_CHANNEL_POSITION_LFE;
|
||||
ret.map[4] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
ret.map[5] = PA_CHANNEL_POSITION_REAR_RIGHT;
|
||||
ret.map[6] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
ret.map[7] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
|
||||
switch (layout) {
|
||||
case SPEAKERS_MONO:
|
||||
ret.channels = 1;
|
||||
ret.map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
break;
|
||||
|
||||
case SPEAKERS_STEREO:
|
||||
ret.channels = 2;
|
||||
break;
|
||||
|
||||
case SPEAKERS_2POINT1:
|
||||
ret.channels = 3;
|
||||
ret.map[2] = PA_CHANNEL_POSITION_LFE;
|
||||
break;
|
||||
|
||||
case SPEAKERS_4POINT0:
|
||||
ret.channels = 4;
|
||||
ret.map[3] = PA_CHANNEL_POSITION_REAR_CENTER;
|
||||
break;
|
||||
|
||||
case SPEAKERS_4POINT1:
|
||||
ret.channels = 5;
|
||||
ret.map[4] = PA_CHANNEL_POSITION_REAR_CENTER;
|
||||
break;
|
||||
|
||||
case SPEAKERS_5POINT1:
|
||||
ret.channels = 6;
|
||||
break;
|
||||
|
||||
case SPEAKERS_7POINT1:
|
||||
ret.channels = 8;
|
||||
break;
|
||||
|
||||
case SPEAKERS_UNKNOWN:
|
||||
default:
|
||||
ret.channels = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline uint64_t samples_to_ns(size_t frames, uint_fast32_t rate)
|
||||
{
|
||||
return frames * NSEC_PER_SEC / rate;
|
||||
|
|
@ -164,11 +220,30 @@ static void pulse_server_info(pa_context *c, const pa_server_info *i,
|
|||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
UNUSED_PARAMETER(userdata);
|
||||
PULSE_DATA(userdata);
|
||||
|
||||
blog(LOG_INFO, "Server name: '%s %s'",
|
||||
i->server_name, i->server_version);
|
||||
|
||||
if (data->device && strcmp("default", data->device) == 0) {
|
||||
if (data->input) {
|
||||
bfree(data->device);
|
||||
data->device = bstrdup(i->default_source_name);
|
||||
|
||||
blog(LOG_DEBUG, "Default input device: '%s'", data->device);
|
||||
} else {
|
||||
char *monitor = bzalloc(strlen(i->default_sink_name) + 9);
|
||||
strcat(monitor, i->default_sink_name);
|
||||
strcat(monitor, ".monitor");
|
||||
|
||||
bfree(data->device);
|
||||
data->device = bstrdup(monitor);
|
||||
|
||||
blog(LOG_DEBUG, "Default output device: '%s'", data->device);
|
||||
bfree(monitor);
|
||||
}
|
||||
}
|
||||
|
||||
pulse_signal(0);
|
||||
}
|
||||
|
||||
|
|
@ -200,7 +275,7 @@ static void pulse_source_info(pa_context *c, const pa_source_info *i, int eol,
|
|||
|
||||
pa_sample_format_t format = i->sample_spec.format;
|
||||
if (pulse_to_obs_audio_format(format) == AUDIO_FORMAT_UNKNOWN) {
|
||||
format = PA_SAMPLE_S16LE;
|
||||
format = PA_SAMPLE_FLOAT32LE;
|
||||
|
||||
blog(LOG_INFO, "Sample format %s not supported by OBS,"
|
||||
"using %s instead for recording",
|
||||
|
|
@ -266,8 +341,10 @@ static int_fast32_t pulse_start_recording(struct pulse_data *data)
|
|||
data->speakers = pulse_channels_to_obs_speakers(spec.channels);
|
||||
data->bytes_per_frame = pa_frame_size(&spec);
|
||||
|
||||
pa_channel_map channel_map = pulse_channel_map(data->speakers);
|
||||
|
||||
data->stream = pulse_stream_new(obs_source_get_name(data->source),
|
||||
&spec, NULL);
|
||||
&spec, &channel_map);
|
||||
if (!data->stream) {
|
||||
blog(LOG_ERROR, "Unable to create stream");
|
||||
return -1;
|
||||
|
|
@ -343,15 +420,15 @@ skip:
|
|||
/**
|
||||
* output info callback
|
||||
*/
|
||||
static void pulse_output_info(pa_context *c, const pa_source_info *i, int eol,
|
||||
static void pulse_output_info(pa_context *c, const pa_sink_info *i, int eol,
|
||||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
if (eol != 0 || i->monitor_of_sink == PA_INVALID_INDEX)
|
||||
if (eol != 0 || i->monitor_source == PA_INVALID_INDEX)
|
||||
goto skip;
|
||||
|
||||
obs_property_list_add_string((obs_property_t*) userdata,
|
||||
i->description, i->name);
|
||||
i->description, i->monitor_source_name);
|
||||
|
||||
skip:
|
||||
pulse_signal(0);
|
||||
|
|
@ -368,10 +445,18 @@ static obs_properties_t *pulse_properties(bool input)
|
|||
OBS_COMBO_FORMAT_STRING);
|
||||
|
||||
pulse_init();
|
||||
pa_source_info_cb_t cb = (input) ? pulse_input_info : pulse_output_info;
|
||||
pulse_get_source_info_list(cb, (void *) devices);
|
||||
if (input)
|
||||
pulse_get_source_info_list(pulse_input_info, (void *) devices);
|
||||
else
|
||||
pulse_get_sink_info_list(pulse_output_info, (void *) devices);
|
||||
pulse_unref();
|
||||
|
||||
size_t count = obs_property_list_item_count(devices);
|
||||
|
||||
if (count > 0)
|
||||
obs_property_list_insert_string(devices, 0,
|
||||
obs_module_text("Default"), "default");
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
|
|
@ -389,61 +474,12 @@ static obs_properties_t *pulse_output_properties(void *unused)
|
|||
return pulse_properties(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Server info callback
|
||||
*/
|
||||
static void pulse_input_device(pa_context *c, const pa_server_info *i,
|
||||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
obs_data_t *settings = (obs_data_t*) userdata;
|
||||
|
||||
obs_data_set_default_string(settings, "device_id",
|
||||
i->default_source_name);
|
||||
blog(LOG_DEBUG, "Default input device: '%s'", i->default_source_name);
|
||||
|
||||
pulse_signal(0);
|
||||
}
|
||||
|
||||
static void pulse_output_device(pa_context *c, const pa_server_info *i,
|
||||
void *userdata)
|
||||
{
|
||||
UNUSED_PARAMETER(c);
|
||||
obs_data_t *settings = (obs_data_t*) userdata;
|
||||
|
||||
char *monitor = bzalloc(strlen(i->default_sink_name) + 9);
|
||||
strcat(monitor, i->default_sink_name);
|
||||
strcat(monitor, ".monitor");
|
||||
|
||||
obs_data_set_default_string(settings, "device_id", monitor);
|
||||
blog(LOG_DEBUG, "Default output device: '%s'", monitor);
|
||||
bfree(monitor);
|
||||
|
||||
pulse_signal(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get plugin defaults
|
||||
*/
|
||||
static void pulse_defaults(obs_data_t *settings, bool input)
|
||||
static void pulse_defaults(obs_data_t *settings)
|
||||
{
|
||||
pulse_init();
|
||||
|
||||
pa_server_info_cb_t cb = (input)
|
||||
? pulse_input_device : pulse_output_device;
|
||||
pulse_get_server_info(cb, (void *) settings);
|
||||
|
||||
pulse_unref();
|
||||
}
|
||||
|
||||
static void pulse_input_defaults(obs_data_t *settings)
|
||||
{
|
||||
return pulse_defaults(settings, true);
|
||||
}
|
||||
|
||||
static void pulse_output_defaults(obs_data_t *settings)
|
||||
{
|
||||
return pulse_defaults(settings, false);
|
||||
obs_data_set_default_string(settings, "device_id", "default");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -508,10 +544,11 @@ static void pulse_update(void *vptr, obs_data_t *settings)
|
|||
/**
|
||||
* Create the plugin object
|
||||
*/
|
||||
static void *pulse_create(obs_data_t *settings, obs_source_t *source)
|
||||
static void *pulse_create(obs_data_t *settings, obs_source_t *source, bool input)
|
||||
{
|
||||
struct pulse_data *data = bzalloc(sizeof(struct pulse_data));
|
||||
|
||||
data->input = input;
|
||||
data->source = source;
|
||||
|
||||
pulse_init();
|
||||
|
|
@ -520,16 +557,26 @@ static void *pulse_create(obs_data_t *settings, obs_source_t *source)
|
|||
return data;
|
||||
}
|
||||
|
||||
static void *pulse_input_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
return pulse_create(settings, source, true);
|
||||
}
|
||||
|
||||
static void *pulse_output_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
return pulse_create(settings, source, false);
|
||||
}
|
||||
|
||||
struct obs_source_info pulse_input_capture = {
|
||||
.id = "pulse_input_capture",
|
||||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
.output_flags = OBS_SOURCE_AUDIO |
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE,
|
||||
.get_name = pulse_input_getname,
|
||||
.create = pulse_create,
|
||||
.create = pulse_input_create,
|
||||
.destroy = pulse_destroy,
|
||||
.update = pulse_update,
|
||||
.get_defaults = pulse_input_defaults,
|
||||
.get_defaults = pulse_defaults,
|
||||
.get_properties = pulse_input_properties
|
||||
};
|
||||
|
||||
|
|
@ -540,9 +587,9 @@ struct obs_source_info pulse_output_capture = {
|
|||
OBS_SOURCE_DO_NOT_DUPLICATE |
|
||||
OBS_SOURCE_DO_NOT_SELF_MONITOR,
|
||||
.get_name = pulse_output_getname,
|
||||
.create = pulse_create,
|
||||
.create = pulse_output_create,
|
||||
.destroy = pulse_destroy,
|
||||
.update = pulse_update,
|
||||
.get_defaults = pulse_output_defaults,
|
||||
.get_defaults = pulse_defaults,
|
||||
.get_properties = pulse_output_properties
|
||||
};
|
||||
|
|
|
|||
|
|
@ -185,6 +185,28 @@ int_fast32_t pulse_get_source_info_list(pa_source_info_cb_t cb, void* userdata)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int_fast32_t pulse_get_sink_info_list(pa_sink_info_cb_t cb, void *userdata)
|
||||
{
|
||||
if (pulse_context_ready() < 0)
|
||||
return -1;
|
||||
|
||||
pulse_lock();
|
||||
|
||||
pa_operation *op = pa_context_get_sink_info_list(
|
||||
pulse_context, cb, userdata);
|
||||
if (!op) {
|
||||
pulse_unlock();
|
||||
return -1;
|
||||
}
|
||||
while (pa_operation_get_state(op) == PA_OPERATION_RUNNING)
|
||||
pulse_wait();
|
||||
pa_operation_unref(op);
|
||||
|
||||
pulse_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int_fast32_t pulse_get_source_info(pa_source_info_cb_t cb, const char *name,
|
||||
void *userdata)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -93,6 +93,20 @@ void pulse_accept();
|
|||
*/
|
||||
int_fast32_t pulse_get_source_info_list(pa_source_info_cb_t cb, void *userdata);
|
||||
|
||||
/**
|
||||
* Request sink information
|
||||
*
|
||||
* The function will block until the operation was executed and the mainloop
|
||||
* called the provided callback function.
|
||||
*
|
||||
* @return negative on error
|
||||
*
|
||||
* @note The function will block until the server context is ready.
|
||||
*
|
||||
* @warning call without active locks
|
||||
*/
|
||||
int_fast32_t pulse_get_sink_info_list(pa_sink_info_cb_t cb, void *userdata);
|
||||
|
||||
/**
|
||||
* Request source information from a specific source
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
V4L2Input="비디오 캡쳐 장치(V4L2)"
|
||||
V4L2Input="비디오 캡쳐 장치 (V4L2)"
|
||||
Device="장치"
|
||||
Input="입력"
|
||||
VideoFormat="비디오 형식"
|
||||
|
|
|
|||
|
|
@ -7,5 +7,5 @@ DVTiming="Dijital Video Zamanlaması"
|
|||
Resolution="Çözünürlük"
|
||||
FrameRate="Kare Hızı"
|
||||
LeaveUnchanged="Değişmeden Bırak"
|
||||
UseBuffering="Arabelleği Kullan"
|
||||
UseBuffering="Arabelleğe Almayı Kullan"
|
||||
|
||||
|
|
|
|||
6
plugins/linux-v4l2/data/locale/vi-VN.ini
Normal file
6
plugins/linux-v4l2/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
Device="Thiết bị"
|
||||
VideoStandard="Video Tiêu chuẩn"
|
||||
Resolution="Độ phân giải"
|
||||
FrameRate="Tốc độ khung"
|
||||
LeaveUnchanged="Giữ nguyên"
|
||||
|
||||
|
|
@ -101,6 +101,13 @@ static const int v4l2_framesizes[] =
|
|||
1600<<16 | 900,
|
||||
1920<<16 | 1080,
|
||||
1920<<16 | 1200,
|
||||
2560<<16 | 1440,
|
||||
3840<<16 | 2160,
|
||||
|
||||
/* 21:9 */
|
||||
2560<<16 | 1080,
|
||||
3440<<16 | 1440,
|
||||
5120<<16 | 2160,
|
||||
|
||||
/* tv */
|
||||
432<<16 | 520,
|
||||
|
|
|
|||
|
|
@ -3,4 +3,12 @@ Device="Συσκευή"
|
|||
UsePreset="Χρησιμοποιήσε το Προκαθορισμένο"
|
||||
Preset="Προκαθορισμένο"
|
||||
Buffering="Χρήση ενδιάμεσης μνήμης"
|
||||
FrameRate="Ρυθμός καρέ"
|
||||
InputFormat="Μορφή Εισόδου"
|
||||
ColorSpace="Χρωματικός χώρος"
|
||||
VideoRange="Εύρος Βίντεο"
|
||||
VideoRange.Partial="Μερικό"
|
||||
VideoRange.Full="Πλήρες"
|
||||
Auto="Αυτόματο"
|
||||
Unknown="Άγνωστο (%1)"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
AVCapture="Bideoa kapturatzeko gailua"
|
||||
Device="Gailua"
|
||||
UsePreset="Erabili aurrezarpena"
|
||||
Preset="Aurrezarpena"
|
||||
Preset="Aurre-ezarpena"
|
||||
Buffering="Erabili bufferreratzea"
|
||||
FrameRate="Fotograma emaria"
|
||||
InputFormat="Sarrera formatua"
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ Preset="Predvoľba"
|
|||
Buffering="Použiť vyrovnávaciu pamäť"
|
||||
FrameRate="Snímkovacia frekvencia"
|
||||
InputFormat="Vstupný formát"
|
||||
ColorSpace="Farebný priestor"
|
||||
VideoRange="Video rozsah"
|
||||
VideoRange.Partial="Čiastočný"
|
||||
VideoRange.Full="Úplný"
|
||||
Auto="Automaticky"
|
||||
Unknown="Neznámy ($1)"
|
||||
|
|
|
|||
4
plugins/mac-avcapture/data/locale/vi-VN.ini
Normal file
4
plugins/mac-avcapture/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Device="Thiết bị"
|
||||
Auto="Tự động"
|
||||
Unknown="Không xác định ($1)"
|
||||
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
CoreAudio.InputCapture="Audio sarreraren kaptura"
|
||||
CoreAudio.OutputCapture="Audio irteeraren kaptura"
|
||||
CoreAudio.Device="Gailua"
|
||||
CoreAudio.Device.Default="Berezkoa"
|
||||
DisplayCapture="Erakusleiho Harpena"
|
||||
CoreAudio.Device.Default="Lehenetsia"
|
||||
DisplayCapture="Pantaila-kaptura"
|
||||
DisplayCapture.Display="Pantaila"
|
||||
DisplayCapture.ShowCursor="Erakutsi kurtsorea"
|
||||
WindowCapture="Leiho-kaptura"
|
||||
|
|
|
|||
18
plugins/mac-capture/data/locale/vi-VN.ini
Normal file
18
plugins/mac-capture/data/locale/vi-VN.ini
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
CoreAudio.InputCapture="Thiết bị âm thanh đầu vào"
|
||||
CoreAudio.OutputCapture="Thiết bị âm thanh đầu ra"
|
||||
CoreAudio.Device="Thiết bị"
|
||||
CoreAudio.Device.Default="Mặc định"
|
||||
DisplayCapture="Quay màn hình"
|
||||
DisplayCapture.Display="Hiển thị"
|
||||
DisplayCapture.ShowCursor="Hiển thị con trỏ"
|
||||
WindowCapture="Quay cửa sổ"
|
||||
WindowUtils.Window="Cửa sổ"
|
||||
WindowUtils.ShowEmptyNames="Hiện thị cửa sổ mà không có tên"
|
||||
CropMode="Cắt"
|
||||
CropMode.None="Không"
|
||||
CropMode.Manual="Thủ công"
|
||||
Crop.origin.x="Cắt trái"
|
||||
Crop.origin.y="Cắt trên"
|
||||
Crop.size.width="Cắt phải"
|
||||
Crop.size.height="Cắt dưới"
|
||||
|
||||
|
|
@ -187,9 +187,15 @@ static inline enum audio_format convert_ca_format(UInt32 format_flags,
|
|||
|
||||
static inline enum speaker_layout convert_ca_speaker_layout(UInt32 channels)
|
||||
{
|
||||
/* directly map channel count to enum values */
|
||||
if (channels >= 1 && channels <= 8 && channels != 7)
|
||||
return (enum speaker_layout)channels;
|
||||
switch (channels) {
|
||||
case 1: return SPEAKERS_MONO;
|
||||
case 2: return SPEAKERS_STEREO;
|
||||
case 3: return SPEAKERS_2POINT1;
|
||||
case 4: return SPEAKERS_4POINT0;
|
||||
case 5: return SPEAKERS_4POINT1;
|
||||
case 6: return SPEAKERS_5POINT1;
|
||||
case 8: return SPEAKERS_7POINT1;
|
||||
}
|
||||
|
||||
return SPEAKERS_UNKNOWN;
|
||||
}
|
||||
|
|
@ -199,6 +205,14 @@ static bool coreaudio_init_format(struct coreaudio_data *ca)
|
|||
AudioStreamBasicDescription desc;
|
||||
OSStatus stat;
|
||||
UInt32 size = sizeof(desc);
|
||||
struct obs_audio_info aoi;
|
||||
int channels;
|
||||
|
||||
if (!obs_get_audio_info(&aoi)) {
|
||||
blog(LOG_WARNING, "No active audio");
|
||||
return false;
|
||||
}
|
||||
channels = get_audio_channels(aoi.speakers);
|
||||
|
||||
stat = get_property(ca->unit, kAudioUnitProperty_StreamFormat,
|
||||
SCOPE_INPUT, BUS_INPUT, &desc, &size);
|
||||
|
|
@ -207,13 +221,13 @@ static bool coreaudio_init_format(struct coreaudio_data *ca)
|
|||
|
||||
/* Certain types of devices have no limit on channel count, and
|
||||
* there's no way to know the actual number of channels it's using,
|
||||
* so if we encounter this situation just force to stereo */
|
||||
if (desc.mChannelsPerFrame > 8) {
|
||||
desc.mChannelsPerFrame = 2;
|
||||
desc.mBytesPerFrame = 2 * desc.mBitsPerChannel / 8;
|
||||
desc.mBytesPerPacket =
|
||||
desc.mFramesPerPacket * desc.mBytesPerFrame;
|
||||
}
|
||||
* so if we encounter this situation just force to what is defined in output */
|
||||
if (desc.mChannelsPerFrame > 8) {
|
||||
desc.mChannelsPerFrame = channels;
|
||||
desc.mBytesPerFrame = channels * desc.mBitsPerChannel / 8;
|
||||
desc.mBytesPerPacket =
|
||||
desc.mFramesPerPacket * desc.mBytesPerFrame;
|
||||
}
|
||||
|
||||
stat = set_property(ca->unit, kAudioUnitProperty_StreamFormat,
|
||||
SCOPE_OUTPUT, BUS_INPUT, &desc, size);
|
||||
|
|
|
|||
|
|
@ -177,6 +177,15 @@ static inline void window_capture_update_internal(struct window_capture *wc,
|
|||
kCGWindowImageDefault : kCGWindowImageBoundsIgnoreFraming;
|
||||
|
||||
update_window(&wc->window, settings);
|
||||
|
||||
if (wc->window.window_name.length) {
|
||||
blog(LOG_INFO, "[window-capture: '%s'] update settings:\n"
|
||||
"\twindow: %s\n"
|
||||
"\towner: %s",
|
||||
obs_source_get_name(wc->source),
|
||||
[wc->window.window_name UTF8String],
|
||||
[wc->window.owner_name UTF8String]);
|
||||
}
|
||||
}
|
||||
|
||||
static void window_capture_update(void *data, obs_data_t *settings)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
Syphon="Zachytávanie hry (Syphon)"
|
||||
Source="Zdroj"
|
||||
LaunchSyphonInject="Zapnúť SyphonInject"
|
||||
Inject="Zaviesť"
|
||||
Application="Aplikácia"
|
||||
SyphonLicense="Syphon licenia"
|
||||
Crop="Orezať"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue