New upstream version 19.0.3+dfsg1
This commit is contained in:
parent
3708b8e092
commit
1f1bbb3518
534 changed files with 13862 additions and 2459 deletions
5
plugins/coreaudio-encoder/data/locale/bn-BD.ini
Normal file
5
plugins/coreaudio-encoder/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
CoreAudioAAC="CoreAudio AAC এনকোডার"
|
||||
Bitrate="বিটরেট"
|
||||
OutputSamplerate="আউটপুট নমুনার হার"
|
||||
UseInputSampleRate="ইনপুট (OBS) নমুনা রেট (অসমর্থিত bitrates তালিকা হতে পারে) ব্যবহার করুন"
|
||||
|
||||
110
plugins/decklink/audio-repack.c
Normal file
110
plugins/decklink/audio-repack.c
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
#include "audio-repack.h"
|
||||
|
||||
#include <emmintrin.h>
|
||||
|
||||
int check_buffer(struct audio_repack *repack,
|
||||
uint32_t frame_count)
|
||||
{
|
||||
const uint32_t new_size = frame_count * repack->base_dst_size
|
||||
+ repack->extra_dst_size;
|
||||
|
||||
if (repack->packet_size < new_size) {
|
||||
repack->packet_buffer = brealloc(
|
||||
repack->packet_buffer, new_size);
|
||||
if (!repack->packet_buffer)
|
||||
return -1;
|
||||
|
||||
repack->packet_size = new_size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
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 |
|
||||
*/
|
||||
int repack_8to6ch_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;
|
||||
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);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int audio_repack_init(struct audio_repack *repack,
|
||||
audio_repack_mode_t repack_mode, uint8_t sample_bit)
|
||||
{
|
||||
memset(repack, 0, sizeof(*repack));
|
||||
|
||||
if (sample_bit != 16)
|
||||
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;
|
||||
break;
|
||||
|
||||
case repack_mode_8ch_swap23:
|
||||
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;
|
||||
break;
|
||||
|
||||
default: return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void audio_repack_free(struct audio_repack *repack)
|
||||
{
|
||||
if (repack->packet_buffer)
|
||||
bfree(repack->packet_buffer);
|
||||
|
||||
memset(repack, 0, sizeof(*repack));
|
||||
}
|
||||
41
plugins/decklink/audio-repack.h
Normal file
41
plugins/decklink/audio-repack.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <obs.h>
|
||||
|
||||
struct audio_repack;
|
||||
|
||||
typedef int (*audio_repack_func_t)(struct audio_repack *,
|
||||
const uint8_t *, uint32_t);
|
||||
|
||||
struct audio_repack {
|
||||
uint8_t *packet_buffer;
|
||||
uint32_t packet_size;
|
||||
|
||||
uint32_t base_src_size;
|
||||
uint32_t base_dst_size;
|
||||
uint32_t extra_dst_size;
|
||||
|
||||
audio_repack_func_t repack_func;
|
||||
};
|
||||
|
||||
enum _audio_repack_mode {
|
||||
repack_mode_8to6ch_swap23,
|
||||
repack_mode_8ch_swap23,
|
||||
};
|
||||
|
||||
typedef enum _audio_repack_mode audio_repack_mode_t;
|
||||
|
||||
extern int audio_repack_init(struct audio_repack *repack,
|
||||
audio_repack_mode_t repack_mode, uint8_t sample_bit);
|
||||
extern void audio_repack_free(struct audio_repack *repack);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
25
plugins/decklink/audio-repack.hpp
Normal file
25
plugins/decklink/audio-repack.hpp
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#pragma once
|
||||
|
||||
#include "audio-repack.h"
|
||||
|
||||
class AudioRepacker {
|
||||
struct audio_repack arepack;
|
||||
|
||||
public:
|
||||
inline AudioRepacker(audio_repack_mode_t repack_mode)
|
||||
{
|
||||
audio_repack_init(&arepack, repack_mode, 16);
|
||||
}
|
||||
inline ~AudioRepacker()
|
||||
{
|
||||
audio_repack_free(&arepack);
|
||||
}
|
||||
|
||||
inline int repack(const uint8_t *src, uint32_t frame_size)
|
||||
{
|
||||
return (*arepack.repack_func)(&arepack, src, frame_size);
|
||||
}
|
||||
|
||||
inline operator struct audio_repack*() {return &arepack;}
|
||||
inline struct audio_repack *operator->() {return &arepack;}
|
||||
};
|
||||
4
plugins/decklink/data/locale/bn-BD.ini
Normal file
4
plugins/decklink/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
BlackmagicDevice="Blackmagic যন্ত্র"
|
||||
Device="ডিভাইস"
|
||||
PixelFormat="পিক্সেল বিন্যাস"
|
||||
|
||||
|
|
@ -3,4 +3,10 @@ Device="Dispositiu"
|
|||
Mode="Mode"
|
||||
Buffering="Usa memòria intermèdia"
|
||||
PixelFormat="Format de píxel"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Zařízení"
|
|||
Mode="Mód"
|
||||
Buffering="Použít vyrovnávací paměť"
|
||||
PixelFormat="Formát pixelů"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
BlackmagicDevice="Blackmagic enhed"
|
||||
BlackmagicDevice="Blackmagic-enhed"
|
||||
Device="Enhed"
|
||||
Mode="Tilstand"
|
||||
Buffering="Brug buffering"
|
||||
PixelFormat="Pixel format"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Gerät"
|
|||
Mode="Modus"
|
||||
Buffering="Buffering benutzen"
|
||||
PixelFormat="Pixelformat"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Keins"
|
||||
ChannelFormat.2_0ch="2 Kanal"
|
||||
ChannelFormat.5_1ch="5.1 Kanal"
|
||||
ChannelFormat.5_1chBack="5.1 Kanal (hinten)"
|
||||
ChannelFormat.7_1ch="7.1 Kanal"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,3 +3,9 @@ Device="Device"
|
|||
Mode="Mode"
|
||||
Buffering="Use Buffering"
|
||||
PixelFormat="Pixel Format"
|
||||
ChannelFormat="Channel"
|
||||
ChannelFormat.None="None"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Back)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Dispositivo"
|
|||
Mode="Modo"
|
||||
Buffering="Utilizar el almacenamiento en búfer"
|
||||
PixelFormat="Formato de píxel"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Gailua"
|
|||
Mode="Modua"
|
||||
Buffering="Erabili Bufferreratzea"
|
||||
PixelFormat="Pixel formatua"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Laite"
|
|||
Mode="Tila"
|
||||
Buffering="Käytä puskurointia"
|
||||
PixelFormat="Pikselimuoto"
|
||||
ChannelFormat="Kanava"
|
||||
ChannelFormat.None="Ei mitään"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Taka)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Périphérique"
|
|||
Mode="Mode"
|
||||
Buffering="Utiliser la mise en mémoire tampon"
|
||||
PixelFormat="Format de pixel"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Eszköz"
|
|||
Mode="Mód"
|
||||
Buffering="Pufferelés használata"
|
||||
PixelFormat="Képpont formátum"
|
||||
ChannelFormat="Csatorna"
|
||||
ChannelFormat.None="Nincs"
|
||||
ChannelFormat.2_0ch="2cs"
|
||||
ChannelFormat.5_1ch="5.1cs"
|
||||
ChannelFormat.5_1chBack="5.1cs (Hátsó)"
|
||||
ChannelFormat.7_1ch="7.1cs"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
BlackmagicDevice="Blackmagic Device"
|
||||
Device="Dispositivo"
|
||||
Mode="Modalità"
|
||||
Buffering="Usa Buffer"
|
||||
PixelFormat="Formato Pixel"
|
||||
Buffering="Usa buffer"
|
||||
PixelFormat="Formato pixel"
|
||||
ChannelFormat="Canale"
|
||||
ChannelFormat.None="Nessuno"
|
||||
ChannelFormat.2_0ch="2 canali"
|
||||
ChannelFormat.5_1ch="5.1 canali"
|
||||
ChannelFormat.5_1chBack="5.1 canali (retro)"
|
||||
ChannelFormat.7_1ch="7.1 canali"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="デバイス"
|
|||
Mode="モード"
|
||||
Buffering="バッファリングを使用する"
|
||||
PixelFormat="ピクセルフォーマット"
|
||||
ChannelFormat="チャンネル"
|
||||
ChannelFormat.None="未設定"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (背部)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="장치"
|
|||
Mode="방식"
|
||||
Buffering="버퍼링 사용"
|
||||
PixelFormat="픽셀 형식"
|
||||
ChannelFormat="채널"
|
||||
ChannelFormat.None="없음"
|
||||
ChannelFormat.2_0ch="2채널"
|
||||
ChannelFormat.5_1ch="5.1채널"
|
||||
ChannelFormat.5_1chBack="5.1채널 (후면)"
|
||||
ChannelFormat.7_1ch="7.1채널"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Apparaat"
|
|||
Mode="Modus"
|
||||
Buffering="Buffering Gebruiken"
|
||||
PixelFormat="Pixelindeling"
|
||||
ChannelFormat="Kanaal"
|
||||
ChannelFormat.None="Geen"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Achter)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Urządzenie"
|
|||
Mode="Tryb"
|
||||
Buffering="Użyj buforowania"
|
||||
PixelFormat="Format pikseli"
|
||||
ChannelFormat="Kanały"
|
||||
ChannelFormat.None="Brak"
|
||||
ChannelFormat.2_0ch="2.0"
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (tylne)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Dispositivo"
|
|||
Mode="Modo"
|
||||
Buffering="Utilizar Buffering"
|
||||
PixelFormat="Formato de Pixel"
|
||||
ChannelFormat="Canal"
|
||||
ChannelFormat.None="Nenhum"
|
||||
ChannelFormat.2_0ch="2.0"
|
||||
ChannelFormat.5_1ch="5.1"
|
||||
ChannelFormat.5_1chBack="5.1 (Traseiro)"
|
||||
ChannelFormat.7_1ch="7.1"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Устройство"
|
|||
Mode="Режим"
|
||||
Buffering="Использовать буферизацию"
|
||||
PixelFormat="Формат пикселей"
|
||||
ChannelFormat="Конфигурация каналов"
|
||||
ChannelFormat.None="Нет"
|
||||
ChannelFormat.2_0ch="2-канальный"
|
||||
ChannelFormat.5_1ch="5.1-канальный"
|
||||
ChannelFormat.5_1chBack="5.1-канальный (Тыловой)"
|
||||
ChannelFormat.7_1ch="7.1-канальный"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Enhet"
|
|||
Mode="Läge"
|
||||
Buffering="Använd buffert"
|
||||
PixelFormat="Bildpunktsformat"
|
||||
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"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Aygıt"
|
|||
Mode="Mod"
|
||||
Buffering="Arabelleği Kullan"
|
||||
PixelFormat="Piksel Biçimi"
|
||||
ChannelFormat="Kanal"
|
||||
ChannelFormat.None="Hiçbiri"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (Arka)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="Пристрій"
|
|||
Mode="Режим"
|
||||
Buffering="Увімкнути буферизацію"
|
||||
PixelFormat="Формат пікселів"
|
||||
ChannelFormat="Звук (канали)"
|
||||
ChannelFormat.None="Немає"
|
||||
ChannelFormat.2_0ch="2-канальний"
|
||||
ChannelFormat.5_1ch="5.1-канальний"
|
||||
ChannelFormat.5_1chBack="5.1-канальний (Back)"
|
||||
ChannelFormat.7_1ch="7.1-канальний"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="设备"
|
|||
Mode="模式"
|
||||
Buffering="使用缓冲"
|
||||
PixelFormat="像素格式"
|
||||
ChannelFormat="频道"
|
||||
ChannelFormat.None="无"
|
||||
ChannelFormat.2_0ch="2ch"
|
||||
ChannelFormat.5_1ch="5.1ch"
|
||||
ChannelFormat.5_1chBack="5.1ch (后)"
|
||||
ChannelFormat.7_1ch="7.1ch"
|
||||
|
||||
|
|
|
|||
|
|
@ -3,4 +3,10 @@ Device="裝置"
|
|||
Mode="模式"
|
||||
Buffering="使用緩衝"
|
||||
PixelFormat="像素格式"
|
||||
ChannelFormat="聲道"
|
||||
ChannelFormat.None="無"
|
||||
ChannelFormat.2_0ch="雙聲道"
|
||||
ChannelFormat.5_1ch="5.1聲道"
|
||||
ChannelFormat.5_1chBack="5.1聲道(後置環繞喇叭)"
|
||||
ChannelFormat.7_1ch="7.1聲道"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#include "decklink-device-instance.hpp"
|
||||
#include "audio-repack.hpp"
|
||||
|
||||
#include <util/platform.h>
|
||||
#include <util/threading.h>
|
||||
|
|
@ -8,6 +9,8 @@
|
|||
#define LOG(level, message, ...) blog(level, "%s: " message, \
|
||||
obs_source_get_name(this->decklink->GetSource()), ##__VA_ARGS__)
|
||||
|
||||
#define ISSTEREO(flag) ((flag) == SPEAKERS_STEREO)
|
||||
|
||||
static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
|
||||
{
|
||||
switch (format) {
|
||||
|
|
@ -20,6 +23,36 @@ static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
|
|||
return VIDEO_FORMAT_UYVY;
|
||||
}
|
||||
|
||||
static inline int ConvertChannelFormat(speaker_layout format)
|
||||
{
|
||||
switch (format) {
|
||||
case SPEAKERS_5POINT1:
|
||||
case SPEAKERS_5POINT1_SURROUND:
|
||||
case SPEAKERS_7POINT1:
|
||||
return 8;
|
||||
|
||||
default:
|
||||
case SPEAKERS_STEREO:
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
static inline audio_repack_mode_t ConvertRepackFormat(speaker_layout format)
|
||||
{
|
||||
switch (format) {
|
||||
case SPEAKERS_5POINT1:
|
||||
case SPEAKERS_5POINT1_SURROUND:
|
||||
return repack_mode_8to6ch_swap23;
|
||||
|
||||
case SPEAKERS_7POINT1:
|
||||
return repack_mode_8ch_swap23;
|
||||
|
||||
default:
|
||||
assert(false && "No repack requested");
|
||||
return (audio_repack_mode_t)-1;
|
||||
}
|
||||
}
|
||||
|
||||
DeckLinkDeviceInstance::DeckLinkDeviceInstance(DeckLink *decklink_,
|
||||
DeckLinkDevice *device_) :
|
||||
currentFrame(), currentPacket(), decklink(decklink_), device(device_)
|
||||
|
|
@ -46,9 +79,23 @@ void DeckLinkDeviceInstance::HandleAudioPacket(
|
|||
return;
|
||||
}
|
||||
|
||||
currentPacket.data[0] = (uint8_t *)bytes;
|
||||
currentPacket.frames = (uint32_t)audioPacket->GetSampleFrameCount();
|
||||
currentPacket.timestamp = timestamp;
|
||||
const uint32_t frameCount = (uint32_t)audioPacket->GetSampleFrameCount();
|
||||
currentPacket.frames = frameCount;
|
||||
currentPacket.timestamp = timestamp;
|
||||
|
||||
if (!ISSTEREO(channelFormat)) {
|
||||
if (audioRepacker->repack((uint8_t *)bytes, frameCount) < 0) {
|
||||
LOG(LOG_ERROR, "Failed to convert audio packet data");
|
||||
return;
|
||||
}
|
||||
|
||||
currentPacket.data[0] = (*audioRepacker)->packet_buffer;
|
||||
} else {
|
||||
currentPacket.data[0] = (uint8_t *)bytes;
|
||||
}
|
||||
|
||||
nextAudioTS = timestamp +
|
||||
((uint64_t)frameCount * 1000000000ULL / 48000ULL) + 1;
|
||||
|
||||
obs_source_output_audio(decklink->GetSource(), ¤tPacket);
|
||||
}
|
||||
|
|
@ -78,6 +125,19 @@ void DeckLinkDeviceInstance::HandleVideoFrame(
|
|||
obs_source_output_video(decklink->GetSource(), ¤tFrame);
|
||||
}
|
||||
|
||||
void DeckLinkDeviceInstance::FinalizeStream()
|
||||
{
|
||||
input->SetCallback(nullptr);
|
||||
|
||||
if (audioRepacker != nullptr)
|
||||
{
|
||||
delete audioRepacker;
|
||||
audioRepacker = nullptr;
|
||||
}
|
||||
|
||||
mode = nullptr;
|
||||
}
|
||||
|
||||
bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
|
||||
{
|
||||
if (mode != nullptr)
|
||||
|
|
@ -93,8 +153,6 @@ bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
|
|||
pixelFormat = decklink->GetPixelFormat();
|
||||
currentFrame.format = ConvertPixelFormat(pixelFormat);
|
||||
|
||||
input->SetCallback(this);
|
||||
|
||||
const BMDDisplayMode displayMode = mode_->GetDisplayMode();
|
||||
|
||||
const HRESULT videoResult = input->EnableVideoInput(displayMode,
|
||||
|
|
@ -102,22 +160,36 @@ bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
|
|||
|
||||
if (videoResult != S_OK) {
|
||||
LOG(LOG_ERROR, "Failed to enable video input");
|
||||
input->SetCallback(nullptr);
|
||||
return false;
|
||||
}
|
||||
|
||||
const HRESULT audioResult = input->EnableAudioInput(
|
||||
bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger,
|
||||
2);
|
||||
channelFormat = decklink->GetChannelFormat();
|
||||
currentPacket.speakers = channelFormat;
|
||||
|
||||
if (audioResult != S_OK)
|
||||
LOG(LOG_WARNING, "Failed to enable audio input; continuing...");
|
||||
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);
|
||||
audioRepacker = new AudioRepacker(repack_mode);
|
||||
}
|
||||
}
|
||||
|
||||
if (input->SetCallback(this) != S_OK) {
|
||||
LOG(LOG_ERROR, "Failed to set callback");
|
||||
FinalizeStream();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (input->StartStreams() != S_OK) {
|
||||
LOG(LOG_ERROR, "Failed to start streams");
|
||||
input->SetCallback(nullptr);
|
||||
input->DisableVideoInput();
|
||||
input->DisableAudioInput();
|
||||
FinalizeStream();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -135,11 +207,7 @@ bool DeckLinkDeviceInstance::StopCapture(void)
|
|||
GetDevice()->GetDisplayName().c_str());
|
||||
|
||||
input->StopStreams();
|
||||
input->SetCallback(nullptr);
|
||||
input->DisableVideoInput();
|
||||
input->DisableAudioInput();
|
||||
|
||||
mode = nullptr;
|
||||
FinalizeStream();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -154,10 +222,27 @@ HRESULT STDMETHODCALLTYPE DeckLinkDeviceInstance::VideoInputFrameArrived(
|
|||
BMDTimeValue videoDur = 0;
|
||||
BMDTimeValue audioTS = 0;
|
||||
|
||||
if (videoFrame)
|
||||
if (videoFrame) {
|
||||
videoFrame->GetStreamTime(&videoTS, &videoDur, TIME_BASE);
|
||||
if (audioPacket)
|
||||
audioPacket->GetPacketTime(&audioTS, TIME_BASE);
|
||||
lastVideoTS = (uint64_t)videoTS;
|
||||
}
|
||||
if (audioPacket) {
|
||||
BMDTimeValue newAudioTS = 0;
|
||||
int64_t diff;
|
||||
|
||||
audioPacket->GetPacketTime(&newAudioTS, TIME_BASE);
|
||||
audioTS = newAudioTS + audioOffset;
|
||||
|
||||
diff = (int64_t)audioTS - (int64_t)nextAudioTS;
|
||||
if (diff > 10000000LL) {
|
||||
audioOffset -= diff;
|
||||
audioTS = newAudioTS + audioOffset;
|
||||
|
||||
} else if (diff < -1000000) {
|
||||
audioOffset = 0;
|
||||
audioTS = newAudioTS;
|
||||
}
|
||||
}
|
||||
|
||||
if (videoFrame && videoTS >= 0)
|
||||
HandleVideoFrame(videoFrame, (uint64_t)videoTS);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
#include "decklink-device.hpp"
|
||||
|
||||
class AudioRepacker;
|
||||
|
||||
class DeckLinkDeviceInstance : public IDeckLinkInputCallback {
|
||||
protected:
|
||||
struct obs_source_frame currentFrame;
|
||||
|
|
@ -12,6 +14,13 @@ protected:
|
|||
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
|
||||
ComPtr<IDeckLinkInput> input;
|
||||
volatile long refCount = 1;
|
||||
int64_t audioOffset = 0;
|
||||
uint64_t nextAudioTS = 0;
|
||||
uint64_t lastVideoTS = 0;
|
||||
AudioRepacker *audioRepacker = nullptr;
|
||||
speaker_layout channelFormat = SPEAKERS_STEREO;
|
||||
|
||||
void FinalizeStream();
|
||||
|
||||
void HandleAudioPacket(IDeckLinkAudioInputPacket *audioPacket,
|
||||
const uint64_t timestamp);
|
||||
|
|
@ -29,6 +38,7 @@ public:
|
|||
}
|
||||
|
||||
inline BMDPixelFormat GetActivePixelFormat() const {return pixelFormat;}
|
||||
inline speaker_layout GetActiveChannelFormat() const {return channelFormat;}
|
||||
|
||||
inline DeckLinkDeviceMode *GetMode() const {return mode;}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,15 @@ bool DeckLinkDevice::Init()
|
|||
if (result != S_OK)
|
||||
return true;
|
||||
|
||||
int64_t channels;
|
||||
/* Intensity Shuttle for Thunderbolt return 2; however, it supports 8 channels */
|
||||
if (name == "Intensity Shuttle Thunderbolt")
|
||||
maxChannel = 8;
|
||||
else if (attributes->GetInt(BMDDeckLinkMaximumAudioChannels, &channels) == S_OK)
|
||||
maxChannel = (int32_t)channels;
|
||||
else
|
||||
maxChannel = 2;
|
||||
|
||||
/* http://forum.blackmagicdesign.com/viewtopic.php?f=12&t=33967
|
||||
* BMDDeckLinkTopologicalID for older devices
|
||||
* BMDDeckLinkPersistentID for newer ones */
|
||||
|
|
@ -118,3 +127,8 @@ const std::string& DeckLinkDevice::GetName(void) const
|
|||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
int32_t DeckLinkDevice::GetMaxChannel(void) const
|
||||
{
|
||||
return maxChannel;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ class DeckLinkDevice {
|
|||
std::string name;
|
||||
std::string displayName;
|
||||
std::string hash;
|
||||
int32_t maxChannel;
|
||||
volatile long refCount = 1;
|
||||
|
||||
public:
|
||||
|
|
@ -30,6 +31,7 @@ public:
|
|||
const std::string& GetHash(void) const;
|
||||
const std::vector<DeckLinkDeviceMode *>& GetModes(void) const;
|
||||
const std::string& GetName(void) const;
|
||||
int32_t GetMaxChannel(void) const;
|
||||
|
||||
bool GetInput(IDeckLinkInput **input);
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,8 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId)
|
|||
if (!isActive)
|
||||
return false;
|
||||
if (instance->GetActiveModeId() == modeId &&
|
||||
instance->GetActivePixelFormat() == pixelFormat)
|
||||
instance->GetActivePixelFormat() == pixelFormat &&
|
||||
instance->GetActiveChannelFormat() == channelFormat)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ protected:
|
|||
volatile long activateRefs = 0;
|
||||
std::recursive_mutex deviceMutex;
|
||||
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
|
||||
speaker_layout channelFormat = SPEAKERS_STEREO;
|
||||
|
||||
void SaveSettings();
|
||||
static void DevicesChanged(void *param, DeckLinkDevice *device,
|
||||
|
|
@ -41,6 +42,11 @@ public:
|
|||
{
|
||||
pixelFormat = format;
|
||||
}
|
||||
inline speaker_layout GetChannelFormat() const {return channelFormat;}
|
||||
inline void SetChannelFormat(speaker_layout format)
|
||||
{
|
||||
channelFormat = format;
|
||||
}
|
||||
|
||||
bool Activate(DeckLinkDevice *device, long long modeId);
|
||||
void Deactivate();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
project(linux-decklink)
|
||||
|
||||
if(DISABLE_DECKLINK)
|
||||
message(STATUS "decklink plugin disabled")
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(linux-decklink-sdk_HEADERS
|
||||
decklink-sdk/DeckLinkAPI.h
|
||||
decklink-sdk/DeckLinkAPIConfiguration.h
|
||||
|
|
@ -22,6 +27,8 @@ set(linux-decklink_HEADERS
|
|||
../decklink-device-discovery.hpp
|
||||
../decklink-device.hpp
|
||||
../decklink-device-mode.hpp
|
||||
../audio-repack.h
|
||||
../audio-repack.hpp
|
||||
)
|
||||
|
||||
set(linux-decklink_SOURCES
|
||||
|
|
@ -31,6 +38,7 @@ set(linux-decklink_SOURCES
|
|||
../decklink-device-discovery.cpp
|
||||
../decklink-device.cpp
|
||||
../decklink-device-mode.cpp
|
||||
../audio-repack.c
|
||||
platform.cpp)
|
||||
|
||||
add_library(linux-decklink MODULE
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
project(mac-decklink)
|
||||
|
||||
if(DISABLE_DECKLINK)
|
||||
message(STATUS "decklink plugin disabled")
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_library(COREFOUNDATION CoreFoundation)
|
||||
|
||||
include_directories(${COREFOUNDATION})
|
||||
|
|
@ -26,6 +31,8 @@ set(mac-decklink_HEADERS
|
|||
../decklink-device-discovery.hpp
|
||||
../decklink-device.hpp
|
||||
../decklink-device-mode.hpp
|
||||
../audio-repack.h
|
||||
../audio-repack.hpp
|
||||
)
|
||||
|
||||
set(mac-decklink_SOURCES
|
||||
|
|
@ -35,6 +42,7 @@ set(mac-decklink_SOURCES
|
|||
../decklink-device-discovery.cpp
|
||||
../decklink-device.cpp
|
||||
../decklink-device-mode.cpp
|
||||
../audio-repack.c
|
||||
platform.cpp)
|
||||
|
||||
add_library(mac-decklink MODULE
|
||||
|
|
|
|||
|
|
@ -7,17 +7,31 @@
|
|||
OBS_DECLARE_MODULE()
|
||||
OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US")
|
||||
|
||||
#define DEVICE_HASH "device_hash"
|
||||
#define DEVICE_NAME "device_name"
|
||||
#define MODE_ID "mode_id"
|
||||
#define MODE_NAME "mode_name"
|
||||
#define CHANNEL_FORMAT "channel_format"
|
||||
#define PIXEL_FORMAT "pixel_format"
|
||||
#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_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_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")
|
||||
|
||||
static DeckLinkDeviceDiscovery *deviceEnum = nullptr;
|
||||
|
||||
static void decklink_enable_buffering(DeckLink *decklink, bool enabled)
|
||||
{
|
||||
obs_source_t *source = decklink->GetSource();
|
||||
uint32_t flags = obs_source_get_flags(source);
|
||||
if (enabled)
|
||||
flags &= ~OBS_SOURCE_FLAG_UNBUFFERED;
|
||||
else
|
||||
flags |= OBS_SOURCE_FLAG_UNBUFFERED;
|
||||
obs_source_set_flags(source, flags);
|
||||
obs_source_set_async_unbuffered(source, !enabled);
|
||||
}
|
||||
|
||||
static void *decklink_create(obs_data_t *settings, obs_source_t *source)
|
||||
|
|
@ -25,7 +39,7 @@ static void *decklink_create(obs_data_t *settings, obs_source_t *source)
|
|||
DeckLink *decklink = new DeckLink(source, deviceEnum);
|
||||
|
||||
decklink_enable_buffering(decklink,
|
||||
obs_data_get_bool(settings, "buffering"));
|
||||
obs_data_get_bool(settings, BUFFERING));
|
||||
|
||||
obs_source_update(source, settings);
|
||||
return decklink;
|
||||
|
|
@ -40,25 +54,29 @@ static void decklink_destroy(void *data)
|
|||
static void decklink_update(void *data, obs_data_t *settings)
|
||||
{
|
||||
DeckLink *decklink = (DeckLink *)data;
|
||||
const char *hash = obs_data_get_string(settings, "device_hash");
|
||||
long long id = obs_data_get_int(settings, "mode_id");
|
||||
BMDPixelFormat format = (BMDPixelFormat)obs_data_get_int(settings,
|
||||
"pixel_format");
|
||||
const char *hash = obs_data_get_string(settings, DEVICE_HASH);
|
||||
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);
|
||||
|
||||
decklink_enable_buffering(decklink,
|
||||
obs_data_get_bool(settings, "buffering"));
|
||||
obs_data_get_bool(settings, BUFFERING));
|
||||
|
||||
ComPtr<DeckLinkDevice> device;
|
||||
device.Set(deviceEnum->FindByHash(hash));
|
||||
|
||||
decklink->SetPixelFormat(format);
|
||||
decklink->SetPixelFormat(pixelFormat);
|
||||
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_int(settings, "pixel_format", bmdFormat8BitYUV);
|
||||
obs_data_set_default_bool(settings, BUFFERING, true);
|
||||
obs_data_set_default_int(settings, PIXEL_FORMAT, bmdFormat8BitYUV);
|
||||
obs_data_set_default_int(settings, CHANNEL_FORMAT, SPEAKERS_STEREO);
|
||||
}
|
||||
|
||||
static const char *decklink_get_name(void*)
|
||||
|
|
@ -69,10 +87,10 @@ static const char *decklink_get_name(void*)
|
|||
static bool decklink_device_changed(obs_properties_t *props,
|
||||
obs_property_t *list, obs_data_t *settings)
|
||||
{
|
||||
const char *name = obs_data_get_string(settings, "device_name");
|
||||
const char *hash = obs_data_get_string(settings, "device_hash");
|
||||
const char *mode = obs_data_get_string(settings, "mode_name");
|
||||
long long modeId = obs_data_get_int(settings, "mode_id");
|
||||
const char *name = obs_data_get_string(settings, DEVICE_NAME);
|
||||
const char *hash = obs_data_get_string(settings, DEVICE_HASH);
|
||||
const char *mode = obs_data_get_string(settings, MODE_NAME);
|
||||
long long modeId = obs_data_get_int(settings, MODE_ID);
|
||||
|
||||
size_t itemCount = obs_property_list_item_count(list);
|
||||
bool itemFound = false;
|
||||
|
|
@ -90,25 +108,41 @@ static bool decklink_device_changed(obs_properties_t *props,
|
|||
obs_property_list_item_disable(list, 0, true);
|
||||
}
|
||||
|
||||
list = obs_properties_get(props, "mode_id");
|
||||
obs_property_t *modeList = obs_properties_get(props, MODE_ID);
|
||||
obs_property_t *channelList = obs_properties_get(props, CHANNEL_FORMAT);
|
||||
|
||||
obs_property_list_clear(list);
|
||||
obs_property_list_clear(modeList);
|
||||
|
||||
obs_property_list_clear(channelList);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_NONE,
|
||||
SPEAKERS_UNKNOWN);
|
||||
obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_2_0CH,
|
||||
SPEAKERS_STEREO);
|
||||
|
||||
ComPtr<DeckLinkDevice> device;
|
||||
device.Set(deviceEnum->FindByHash(hash));
|
||||
|
||||
if (!device) {
|
||||
obs_property_list_add_int(list, mode, modeId);
|
||||
obs_property_list_item_disable(list, 0, true);
|
||||
obs_property_list_add_int(modeList, mode, modeId);
|
||||
obs_property_list_item_disable(modeList, 0, true);
|
||||
} else {
|
||||
const std::vector<DeckLinkDeviceMode*> &modes =
|
||||
device->GetModes();
|
||||
|
||||
for (DeckLinkDeviceMode *mode : modes) {
|
||||
obs_property_list_add_int(list,
|
||||
obs_property_list_add_int(modeList,
|
||||
mode->GetName().c_str(),
|
||||
mode->GetId());
|
||||
}
|
||||
|
||||
if (device->GetMaxChannel() >= 8) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -132,26 +166,30 @@ static obs_properties_t *decklink_get_properties(void *data)
|
|||
{
|
||||
obs_properties_t *props = obs_properties_create();
|
||||
|
||||
obs_property_t *list = obs_properties_add_list(props, "device_hash",
|
||||
obs_module_text("Device"), OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_t *list = obs_properties_add_list(props, DEVICE_HASH,
|
||||
TEXT_DEVICE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_set_modified_callback(list, decklink_device_changed);
|
||||
|
||||
fill_out_devices(list);
|
||||
|
||||
list = obs_properties_add_list(props, "mode_id",
|
||||
obs_module_text("Mode"), OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_INT);
|
||||
list = obs_properties_add_list(props, MODE_ID, TEXT_MODE,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
||||
|
||||
list = obs_properties_add_list(props, "pixel_format",
|
||||
obs_module_text("PixelFormat"), OBS_COMBO_TYPE_LIST,
|
||||
list = obs_properties_add_list(props, PIXEL_FORMAT,
|
||||
TEXT_PIXEL_FORMAT, OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_INT);
|
||||
|
||||
obs_property_list_add_int(list, "8-bit YUV", bmdFormat8BitYUV);
|
||||
obs_property_list_add_int(list, "8-bit BGRA", bmdFormat8BitBGRA);
|
||||
|
||||
obs_properties_add_bool(props, "buffering",
|
||||
obs_module_text("Buffering"));
|
||||
list = obs_properties_add_list(props, CHANNEL_FORMAT,
|
||||
TEXT_CHANNEL_FORMAT, OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_INT);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_NONE,
|
||||
SPEAKERS_UNKNOWN);
|
||||
obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_0CH,
|
||||
SPEAKERS_STEREO);
|
||||
|
||||
obs_properties_add_bool(props, BUFFERING, TEXT_BUFFERING);
|
||||
|
||||
UNUSED_PARAMETER(data);
|
||||
return props;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
project(win-decklink)
|
||||
|
||||
if(DISABLE_DECKLINK)
|
||||
message(STATUS "decklink plugin disabled")
|
||||
return()
|
||||
endif()
|
||||
|
||||
include(IDLFileHelper)
|
||||
|
||||
set(win-decklink-sdk_IDLS
|
||||
|
|
@ -17,6 +22,8 @@ set(win-decklink_HEADERS
|
|||
../decklink-device-discovery.hpp
|
||||
../decklink-device.hpp
|
||||
../decklink-device-mode.hpp
|
||||
../audio-repack.h
|
||||
../audio-repack.hpp
|
||||
)
|
||||
|
||||
set(win-decklink_SOURCES
|
||||
|
|
@ -26,6 +33,7 @@ set(win-decklink_SOURCES
|
|||
../decklink-device-discovery.cpp
|
||||
../decklink-device.cpp
|
||||
../decklink-device-mode.cpp
|
||||
../audio-repack.c
|
||||
platform.cpp)
|
||||
|
||||
add_idl_files(win-decklink-sdk_GENERATED_FILES
|
||||
|
|
|
|||
13
plugins/image-source/data/locale/bn-BD.ini
Normal file
13
plugins/image-source/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
ImageInput="ছবি"
|
||||
File="ফাইল ছবি"
|
||||
|
||||
SlideShow="ছবি স্লাইড শো"
|
||||
SlideShow.TransitionSpeed="কোনও পরিবর্তন ঘটলে স্থানীয় গতি (মিলিসেকেন্ড)"
|
||||
SlideShow.Transition="স্থানান্তর"
|
||||
SlideShow.Transition.Cut="ছেদন"
|
||||
|
||||
ColorSource="রঙের উৎস"
|
||||
ColorSource.Color="রং"
|
||||
ColorSource.Width="প্রস্থ"
|
||||
ColorSource.Height="উচ্চতা"
|
||||
|
||||
|
|
@ -6,6 +6,8 @@ SlideShow="Obrázková prezentace"
|
|||
SlideShow.TransitionSpeed="Rychlost přechodu (milisekundy)"
|
||||
SlideShow.SlideTime="Čas mezi snímky (milisekundy)"
|
||||
SlideShow.Files="Soubory obrázků"
|
||||
SlideShow.CustomSize="Poměr stran"
|
||||
SlideShow.CustomSize.Auto="Automatický"
|
||||
SlideShow.Randomize="Náhodné přehrávání"
|
||||
SlideShow.Transition="Přechod"
|
||||
SlideShow.Transition.Cut="Střih"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Billede diasshow"
|
|||
SlideShow.TransitionSpeed="Overgangshastighed (millisekunder)"
|
||||
SlideShow.SlideTime="Tid mellem dias (millisekunder)"
|
||||
SlideShow.Files="Billedfiler"
|
||||
SlideShow.CustomSize="Afgrænsningsstørrelse/Formatforhold"
|
||||
SlideShow.CustomSize.Auto="Automatisk"
|
||||
SlideShow.Randomize="Tilfældig afspilning"
|
||||
SlideShow.Transition="Overgang"
|
||||
SlideShow.Transition.Cut="Klip"
|
||||
|
|
@ -13,4 +15,8 @@ SlideShow.Transition.Fade="Overgang"
|
|||
SlideShow.Transition.Swipe="Stryg"
|
||||
SlideShow.Transition.Slide="Glide"
|
||||
|
||||
ColorSource="Farvekilde"
|
||||
ColorSource.Color="Farve"
|
||||
ColorSource.Width="Bredde"
|
||||
ColorSource.Height="Højde"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Diashow"
|
|||
SlideShow.TransitionSpeed="Geschwindigkeit des Übergangs (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.Transition="Übergang"
|
||||
SlideShow.Transition.Cut="Schnitt"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Image Slide Show"
|
|||
SlideShow.TransitionSpeed="Transition Speed (milliseconds)"
|
||||
SlideShow.SlideTime="Time Between Slides (milliseconds)"
|
||||
SlideShow.Files="Image Files"
|
||||
SlideShow.CustomSize="Bounding Size/Aspect Ratio"
|
||||
SlideShow.CustomSize.Auto="Automatic"
|
||||
SlideShow.Randomize="Randomize Playback"
|
||||
SlideShow.Transition="Transition"
|
||||
SlideShow.Transition.Cut="Cut"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Galería de imágenes"
|
|||
SlideShow.TransitionSpeed="Velocidad de la transición (milisegundos)"
|
||||
SlideShow.SlideTime="Tiempo entre diapositivas (milisegundos)"
|
||||
SlideShow.Files="Archivo de imagen"
|
||||
SlideShow.CustomSize="Relación de aspecto"
|
||||
SlideShow.CustomSize.Auto="Automático"
|
||||
SlideShow.Randomize="Reproducción aleatoria"
|
||||
SlideShow.Transition="Transición"
|
||||
SlideShow.Transition.Cut="Corte"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Irudien diaporama"
|
|||
SlideShow.TransitionSpeed="Trantsizioaren abiadura (milisegundotan)"
|
||||
SlideShow.SlideTime="Diapositiben arteko denbora (milisegundotan)"
|
||||
SlideShow.Files="Irudi fitxategiak"
|
||||
SlideShow.CustomSize="Markoaren tamaina/Aspektu-erlazioa"
|
||||
SlideShow.CustomSize.Auto="Automatikoa"
|
||||
SlideShow.Randomize="Ausazko erreprodukzioa"
|
||||
SlideShow.Transition="Trantsizioa"
|
||||
SlideShow.Transition.Cut="Ebaki"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Diaesitys"
|
|||
SlideShow.TransitionSpeed="Siirtymän nopeus (millisekuntia)"
|
||||
SlideShow.SlideTime="Kesto kuvien välissä (millisekunteina)"
|
||||
SlideShow.Files="Kuvatiedostot"
|
||||
SlideShow.CustomSize="Rajauskoko/Kuvasuhde"
|
||||
SlideShow.CustomSize.Auto="Automaattinen"
|
||||
SlideShow.Randomize="Toista satunnaisesti"
|
||||
SlideShow.Transition="Siirtymä"
|
||||
SlideShow.Transition.Cut="Leikkaa"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Diaporama"
|
|||
SlideShow.TransitionSpeed="Vitesse de transition (millisecondes)"
|
||||
SlideShow.SlideTime="Temps entre chaque diapositive (millisecondes)"
|
||||
SlideShow.Files="Fichiers image"
|
||||
SlideShow.CustomSize="Taille Limite/Ratio d'aspect"
|
||||
SlideShow.CustomSize.Auto="Automatique"
|
||||
SlideShow.Randomize="Lecture aléatoire"
|
||||
SlideShow.Transition="Transition"
|
||||
SlideShow.Transition.Cut="Coupure"
|
||||
|
|
|
|||
4
plugins/image-source/data/locale/hi-IN.ini
Normal file
4
plugins/image-source/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
ImageInput="छवि"
|
||||
|
||||
|
||||
|
||||
|
|
@ -6,6 +6,8 @@ SlideShow="Képvetítő"
|
|||
SlideShow.TransitionSpeed="Áttűnési sebesség (ezredmásodperc)"
|
||||
SlideShow.SlideTime="Diák közti idő (ezredmásodperc)"
|
||||
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.Transition="Átmenet"
|
||||
SlideShow.Transition.Cut="Kivágás"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="画像スライドショー"
|
|||
SlideShow.TransitionSpeed="画面切替速度 (ミリ秒)"
|
||||
SlideShow.SlideTime="スライド時間間隔 (ミリ秒)"
|
||||
SlideShow.Files="画像ファイル"
|
||||
SlideShow.CustomSize="バウンディングサイズ/アスペクト比"
|
||||
SlideShow.CustomSize.Auto="自動"
|
||||
SlideShow.Randomize="ランダム再生"
|
||||
SlideShow.Transition="トランジション"
|
||||
SlideShow.Transition.Cut="カット"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="이미지 슬라이드 쇼"
|
|||
SlideShow.TransitionSpeed="전환 속도 (밀리초)"
|
||||
SlideShow.SlideTime="슬라이드 간격 (밀리초)"
|
||||
SlideShow.Files="이미지 파일 형식"
|
||||
SlideShow.CustomSize="경계 크기/화면 비율"
|
||||
SlideShow.CustomSize.Auto="자동"
|
||||
SlideShow.Randomize="무작위 재생"
|
||||
SlideShow.Transition="전환 방식"
|
||||
SlideShow.Transition.Cut="자르기"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Diashow"
|
|||
SlideShow.TransitionSpeed="Overgangssnelheid (milliseconden)"
|
||||
SlideShow.SlideTime="Tijd Tussen Dia's (milliseconden)"
|
||||
SlideShow.Files="Afbeeldingsbestanden"
|
||||
SlideShow.CustomSize="Randgrootte/Beeldverhouding"
|
||||
SlideShow.CustomSize.Auto="Automatisch"
|
||||
SlideShow.Randomize="Willekeurige Volgorde"
|
||||
SlideShow.Transition="Overgang"
|
||||
SlideShow.Transition.Cut="Knippen"
|
||||
|
|
@ -13,4 +15,8 @@ SlideShow.Transition.Fade="Vervagen"
|
|||
SlideShow.Transition.Swipe="Vegen"
|
||||
SlideShow.Transition.Slide="Slide"
|
||||
|
||||
ColorSource="Kleurbron"
|
||||
ColorSource.Color="Kleur"
|
||||
ColorSource.Width="Breedte"
|
||||
ColorSource.Height="Hoogte"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Pokaz slajdów"
|
|||
SlideShow.TransitionSpeed="Prędkość efektu przejścia (ms)"
|
||||
SlideShow.SlideTime="Czas wyświetlania slajdu (ms)"
|
||||
SlideShow.Files="Pliki graficzne"
|
||||
SlideShow.CustomSize="Ograniczenie rozmiaru/Proporcje"
|
||||
SlideShow.CustomSize.Auto="Automatycznie"
|
||||
SlideShow.Randomize="Odtwarzanie losowe"
|
||||
SlideShow.Transition="Efekt przejścia"
|
||||
SlideShow.Transition.Cut="Cięcie"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Apresentação de Slides"
|
|||
SlideShow.TransitionSpeed="Velocidade de Transição (em milissegundos)"
|
||||
SlideShow.SlideTime="Tempo Entre cada Slide (em milissegundos)"
|
||||
SlideShow.Files="Arquivos de Imagem"
|
||||
SlideShow.CustomSize="Tamanho Delimitador/Proporção"
|
||||
SlideShow.CustomSize.Auto="Automático"
|
||||
SlideShow.Randomize="Reprodução aleatória"
|
||||
SlideShow.Transition="Transição"
|
||||
SlideShow.Transition.Cut="Corte"
|
||||
|
|
@ -13,4 +15,8 @@ SlideShow.Transition.Fade="Esmaecer"
|
|||
SlideShow.Transition.Swipe="Arrastar"
|
||||
SlideShow.Transition.Slide="Deslizar"
|
||||
|
||||
ColorSource="Fonte de Cor"
|
||||
ColorSource.Color="Cor"
|
||||
ColorSource.Width="Largura"
|
||||
ColorSource.Height="Altura"
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Слайдшоу"
|
|||
SlideShow.TransitionSpeed="Скорость перехода (миллисекунды)"
|
||||
SlideShow.SlideTime="Время между слайдами (миллисекунды)"
|
||||
SlideShow.Files="Файлы изображений"
|
||||
SlideShow.CustomSize="Ограничение размера/Соотношение сторон"
|
||||
SlideShow.CustomSize.Auto="Автоматически"
|
||||
SlideShow.Randomize="Случайное воспроизведение"
|
||||
SlideShow.Transition="Переход"
|
||||
SlideShow.Transition.Cut="Обрезать"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ SlideShow="Bildspel"
|
|||
SlideShow.TransitionSpeed="Övergångshastighet (millisekunder)"
|
||||
SlideShow.SlideTime="Tid mellan bilder (millisekunder)"
|
||||
SlideShow.Files="Bildfiler"
|
||||
SlideShow.CustomSize.Auto="Automatisk"
|
||||
SlideShow.Randomize="Slumpa uppspelning"
|
||||
SlideShow.Transition="Övergång"
|
||||
SlideShow.Transition.Cut="Klipp"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Resim Slayt Gösterisi"
|
|||
SlideShow.TransitionSpeed="Geçiş Hızı (milisaniye)"
|
||||
SlideShow.SlideTime="Slaytlar Arası Süre (milisaniye)"
|
||||
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.Transition="Geçiş"
|
||||
SlideShow.Transition.Cut="Cut"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="Слайд-шоу"
|
|||
SlideShow.TransitionSpeed="Тривалість відео-переходу (мілісекунд)"
|
||||
SlideShow.SlideTime="Час між слайдами (мілісекунд)"
|
||||
SlideShow.Files="Файли зображень"
|
||||
SlideShow.CustomSize="Розмір рамки/пропорції"
|
||||
SlideShow.CustomSize.Auto="Автоматично"
|
||||
SlideShow.Randomize="Випадкове відтворення"
|
||||
SlideShow.Transition="Відео-перехід"
|
||||
SlideShow.Transition.Cut="Cut"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="图像幻灯片放映"
|
|||
SlideShow.TransitionSpeed="过渡速度(毫秒)"
|
||||
SlideShow.SlideTime="幻灯片之间时间(毫秒)"
|
||||
SlideShow.Files="图像文件"
|
||||
SlideShow.CustomSize="边框大小/高宽比"
|
||||
SlideShow.CustomSize.Auto="自动"
|
||||
SlideShow.Randomize="随机播放"
|
||||
SlideShow.Transition="转换"
|
||||
SlideShow.Transition.Cut="剪切"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ SlideShow="投影片放映"
|
|||
SlideShow.TransitionSpeed="變更速度 (毫秒)"
|
||||
SlideShow.SlideTime="圖片間隔 (毫秒)"
|
||||
SlideShow.Files="圖片檔案"
|
||||
SlideShow.CustomSize="邊框大小長寬比"
|
||||
SlideShow.CustomSize.Auto="自動"
|
||||
SlideShow.Randomize="隨機播放"
|
||||
SlideShow.Transition="變更特效"
|
||||
SlideShow.Transition.Cut="直接變更"
|
||||
|
|
|
|||
|
|
@ -162,6 +162,17 @@ static void image_source_tick(void *data, float seconds)
|
|||
struct image_source *context = data;
|
||||
uint64_t frame_time = obs_get_video_frame_time();
|
||||
|
||||
context->update_time_elapsed += seconds;
|
||||
|
||||
if (context->update_time_elapsed >= 1.0f) {
|
||||
time_t t = get_modified_timestamp(context->file);
|
||||
context->update_time_elapsed = 0.0f;
|
||||
|
||||
if (context->file_timestamp != t) {
|
||||
image_source_load(context);
|
||||
}
|
||||
}
|
||||
|
||||
if (obs_source_active(context->source)) {
|
||||
if (!context->active) {
|
||||
if (context->image.is_animated_gif)
|
||||
|
|
@ -199,17 +210,6 @@ static void image_source_tick(void *data, float seconds)
|
|||
}
|
||||
|
||||
context->last_time = frame_time;
|
||||
|
||||
context->update_time_elapsed += seconds;
|
||||
|
||||
if (context->update_time_elapsed >= 1.0f) {
|
||||
time_t t = get_modified_timestamp(context->file);
|
||||
context->update_time_elapsed = 0.0f;
|
||||
|
||||
if (context->file_timestamp != t) {
|
||||
image_source_load(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
|
||||
|
||||
#define S_TR_SPEED "transition_speed"
|
||||
#define S_CUSTOM_SIZE "use_custom_size"
|
||||
#define S_SLIDE_TIME "slide_time"
|
||||
#define S_TRANSITION "transition"
|
||||
#define S_RANDOMIZE "randomize"
|
||||
|
|
@ -23,6 +24,8 @@
|
|||
|
||||
#define T_(text) obs_module_text("SlideShow." text)
|
||||
#define T_TR_SPEED T_("TransitionSpeed")
|
||||
#define T_CUSTOM_SIZE T_("CustomSize")
|
||||
#define T_CUSTOM_SIZE_AUTO T_("CustomSize.Auto")
|
||||
#define T_SLIDE_TIME T_("SlideTime")
|
||||
#define T_TRANSITION T_("Transition")
|
||||
#define T_RANDOMIZE T_("Randomize")
|
||||
|
|
@ -288,6 +291,48 @@ static void ss_update(void *data, obs_data_t *settings)
|
|||
obs_source_release(old_tr);
|
||||
free_files(&old_files.da);
|
||||
|
||||
/* ------------------------- */
|
||||
|
||||
const char *res_str = obs_data_get_string(settings, S_CUSTOM_SIZE);
|
||||
bool aspect_only = false, use_auto = true;
|
||||
int cx_in = 0, cy_in = 0;
|
||||
|
||||
if (strcmp(res_str, T_CUSTOM_SIZE_AUTO) != 0) {
|
||||
int ret = sscanf(res_str, "%dx%d", &cx_in, &cy_in);
|
||||
if (ret == 2) {
|
||||
aspect_only = false;
|
||||
use_auto = false;
|
||||
} else {
|
||||
ret = sscanf(res_str, "%d:%d", &cx_in, &cy_in);
|
||||
if (ret == 2) {
|
||||
aspect_only = true;
|
||||
use_auto = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!use_auto) {
|
||||
double cx_f = (double)cx;
|
||||
double cy_f = (double)cy;
|
||||
|
||||
double old_aspect = cx_f / cy_f;
|
||||
double new_aspect = (double)cx_in / (double)cy_in;
|
||||
|
||||
if (aspect_only) {
|
||||
if (fabs(old_aspect - new_aspect) > EPSILON) {
|
||||
if (new_aspect > old_aspect)
|
||||
cx = (uint32_t)(cy_f * new_aspect);
|
||||
else
|
||||
cy = (uint32_t)(cx_f / new_aspect);
|
||||
}
|
||||
} else {
|
||||
cx = (uint32_t)cx_in;
|
||||
cy = (uint32_t)cy_in;
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------- */
|
||||
|
||||
ss->cx = cx;
|
||||
ss->cy = cy;
|
||||
ss->cur_item = 0;
|
||||
|
|
@ -460,17 +505,38 @@ static void ss_defaults(obs_data_t *settings)
|
|||
obs_data_set_default_string(settings, S_TRANSITION, "fade");
|
||||
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);
|
||||
}
|
||||
|
||||
static const char *file_filter =
|
||||
"Image files (*.bmp *.tga *.png *.jpeg *.jpg *.gif)";
|
||||
|
||||
static const char *aspects[] = {
|
||||
"16:9",
|
||||
"16:10",
|
||||
"4:3",
|
||||
"1:1"
|
||||
};
|
||||
|
||||
#define NUM_ASPECTS (sizeof(aspects) / sizeof(const char *))
|
||||
|
||||
static obs_properties_t *ss_properties(void *data)
|
||||
{
|
||||
obs_properties_t *ppts = obs_properties_create();
|
||||
struct slideshow *ss = data;
|
||||
struct obs_video_info ovi;
|
||||
struct dstr path = {0};
|
||||
obs_property_t *p;
|
||||
int cx;
|
||||
int cy;
|
||||
|
||||
/* ----------------- */
|
||||
|
||||
obs_get_video_info(&ovi);
|
||||
cx = (int)ovi.base_width;
|
||||
cy = (int)ovi.base_height;
|
||||
|
||||
/* ----------------- */
|
||||
|
||||
p = obs_properties_add_list(ppts, S_TRANSITION, T_TRANSITION,
|
||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
||||
|
|
@ -485,6 +551,18 @@ static obs_properties_t *ss_properties(void *data)
|
|||
0, 3600000, 50);
|
||||
obs_properties_add_bool(ppts, S_RANDOMIZE, T_RANDOMIZE);
|
||||
|
||||
p = obs_properties_add_list(ppts, S_CUSTOM_SIZE, T_CUSTOM_SIZE,
|
||||
OBS_COMBO_TYPE_EDITABLE, OBS_COMBO_FORMAT_STRING);
|
||||
|
||||
obs_property_list_add_string(p, T_CUSTOM_SIZE_AUTO, T_CUSTOM_SIZE_AUTO);
|
||||
|
||||
for (size_t i = 0; i < NUM_ASPECTS; i++)
|
||||
obs_property_list_add_string(p, aspects[i], aspects[i]);
|
||||
|
||||
char str[32];
|
||||
snprintf(str, 32, "%dx%d", cx, cy);
|
||||
obs_property_list_add_string(p, str, str);
|
||||
|
||||
if (ss) {
|
||||
pthread_mutex_lock(&ss->mutex);
|
||||
if (ss->files.num) {
|
||||
|
|
|
|||
2
plugins/linux-alsa/data/locale/bn-BD.ini
Normal file
2
plugins/linux-alsa/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
AlsaInput="অডিও ক্যাপচার ডিভাইস (ALSA)"
|
||||
|
||||
9
plugins/linux-capture/data/locale/bn-BD.ini
Normal file
9
plugins/linux-capture/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
X11SharedMemoryScreenInput="স্ক্রিন ক্যাপচার (XSHM)"
|
||||
Screen="পর্দা"
|
||||
XServer="X সার্ভার"
|
||||
XCCapture="উইন্ডো ক্যাপচার (Xcomposite)"
|
||||
CropLeft="ফসল বাম (পিক্সেল)"
|
||||
CropRight="ফসল অধিকার (পিক্সেল)"
|
||||
CropBottom="ফসল তলায় (পিক্সেল)"
|
||||
ExcludeAlpha="আলফা-কম গঠন বিন্যাস (মেসা পরামর্শ) ব্যবহার করুন"
|
||||
|
||||
|
|
@ -12,4 +12,5 @@ CropBottom="Kärbi alt (pikslit)"
|
|||
SwapRedBlue="Vaheta punane ja sinine"
|
||||
LockX="Lukusta X server salvestamise ajal"
|
||||
IncludeXBorder="Kaasa X piirjoon"
|
||||
ExcludeAlpha="Kasuta alpha-kanalita tekstuuri formaati (Mesa lahendus)"
|
||||
|
||||
|
|
|
|||
2
plugins/linux-capture/data/locale/hi-IN.ini
Normal file
2
plugins/linux-capture/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
X11SharedMemoryScreenInput="स्क्रीन कैप्चर (XSHM)"
|
||||
|
||||
3
plugins/linux-jack/data/locale/bn-BD.ini
Normal file
3
plugins/linux-jack/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
StartJACKServer="জ্যাক সার্ভার চালুকরন্"
|
||||
Channels="চ্যানেল সংখ্যা"
|
||||
|
||||
4
plugins/linux-pulseaudio/data/locale/bn-BD.ini
Normal file
4
plugins/linux-pulseaudio/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
PulseInput="অডিও ইনপুট ক্যাপচার (PulseAudio)"
|
||||
PulseOutput="অডিও ইনপুট ক্যাপচার (PulseAudio)"
|
||||
Device="ডিভাইস"
|
||||
|
||||
2
plugins/linux-pulseaudio/data/locale/hi-IN.ini
Normal file
2
plugins/linux-pulseaudio/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
PulseInput="ऑडियो इनपुट पर कब्जा (पल्सऑडियो)"
|
||||
|
||||
|
|
@ -538,7 +538,7 @@ struct obs_source_info pulse_output_capture = {
|
|||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
.output_flags = OBS_SOURCE_AUDIO |
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE |
|
||||
OBS_SOURCE_DO_NOT_MONITOR,
|
||||
OBS_SOURCE_DO_NOT_SELF_MONITOR,
|
||||
.get_name = pulse_output_getname,
|
||||
.create = pulse_create,
|
||||
.destroy = pulse_destroy,
|
||||
|
|
|
|||
11
plugins/linux-v4l2/data/locale/bn-BD.ini
Normal file
11
plugins/linux-v4l2/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
V4L2Input="ভিডিও ক্যাপচার ডিভাইস (V4L2)"
|
||||
Device="ডিভাইস"
|
||||
Input="ইনপুট"
|
||||
VideoFormat="ভিডিও ফরম্যাট"
|
||||
VideoStandard="ভিডিও মান"
|
||||
DVTiming="DV টাইমিং"
|
||||
Resolution="রেজল্যুশন"
|
||||
FrameRate="ফ্রেমের হার"
|
||||
LeaveUnchanged="ফরাসী"
|
||||
UseBuffering="বাফারিং ব্যবহার করুন"
|
||||
|
||||
2
plugins/linux-v4l2/data/locale/hi-IN.ini
Normal file
2
plugins/linux-v4l2/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
V4L2Input="वीडियो कैप्चर डिवाइस (V4L2)"
|
||||
|
||||
|
|
@ -912,11 +912,8 @@ fail:
|
|||
static void v4l2_update_source_flags(struct v4l2_data *data,
|
||||
obs_data_t *settings)
|
||||
{
|
||||
uint32_t flags = obs_source_get_flags(data->source);
|
||||
flags = (obs_data_get_bool(settings, "buffering"))
|
||||
? flags & ~OBS_SOURCE_FLAG_UNBUFFERED
|
||||
: flags | OBS_SOURCE_FLAG_UNBUFFERED;
|
||||
obs_source_set_flags(data->source, flags);
|
||||
obs_source_set_async_unbuffered(data->source,
|
||||
!obs_data_get_bool(settings, "buffering"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -6,12 +6,14 @@ find_library(COREFOUNDATION CoreFoundation)
|
|||
find_library(COREMEDIA CoreMedia)
|
||||
find_library(COREVIDEO CoreVideo)
|
||||
find_library(COCOA Cocoa)
|
||||
find_library(COREMEDIAIO CoreMediaIO)
|
||||
|
||||
include_directories(${AVFOUNDATION}
|
||||
${COCOA}
|
||||
${COREFOUNDATION}
|
||||
${COREMEDIA}
|
||||
${COREVIDEO}
|
||||
${COREMEDIAIO}
|
||||
${COCOA})
|
||||
|
||||
set(mac-avcapture_HEADERS
|
||||
|
|
@ -36,6 +38,7 @@ target_link_libraries(mac-avcapture
|
|||
${COREFOUNDATION}
|
||||
${COREMEDIA}
|
||||
${COREVIDEO}
|
||||
${COREMEDIAIO}
|
||||
${COCOA})
|
||||
|
||||
install_obs_plugin_with_data(mac-avcapture data)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#import <CoreFoundation/CoreFoundation.h>
|
||||
#import <CoreMedia/CoreMedia.h>
|
||||
#import <CoreVideo/CoreVideo.h>
|
||||
#import <CoreMediaIO/CMIOHardware.h>
|
||||
|
||||
#include <obs-module.h>
|
||||
#include <obs.hpp>
|
||||
|
|
@ -644,13 +645,7 @@ static inline bool update_frame(av_capture *capture,
|
|||
|
||||
static void av_capture_enable_buffering(av_capture *capture, bool enabled)
|
||||
{
|
||||
obs_source_t *source = capture->source;
|
||||
uint32_t flags = obs_source_get_flags(source);
|
||||
if (enabled)
|
||||
flags &= ~OBS_SOURCE_FLAG_UNBUFFERED;
|
||||
else
|
||||
flags |= OBS_SOURCE_FLAG_UNBUFFERED;
|
||||
obs_source_set_flags(source, flags);
|
||||
obs_source_set_async_unbuffered(capture->source, !enabled);
|
||||
}
|
||||
|
||||
static const char *av_capture_getname(void*)
|
||||
|
|
@ -780,7 +775,7 @@ static bool init_format(av_capture *capture, AVCaptureDevice *dev)
|
|||
CMMediaType mtype = CMFormatDescriptionGetMediaType(
|
||||
format.formatDescription);
|
||||
// TODO: support other media types
|
||||
if (mtype != kCMMediaType_Video) {
|
||||
if (mtype != kCMMediaType_Video && mtype != kCMMediaType_Muxed) {
|
||||
AVLOG(LOG_ERROR, "CMMediaType '%s' is unsupported",
|
||||
AV_FOURCC_STR(mtype));
|
||||
return false;
|
||||
|
|
@ -1247,7 +1242,7 @@ static NSArray *presets(void)
|
|||
AVCaptureSessionPreset640x480,
|
||||
AVCaptureSessionPreset352x288,
|
||||
AVCaptureSessionPreset320x240,
|
||||
//AVCaptureSessionPresetHigh,
|
||||
AVCaptureSessionPresetHigh,
|
||||
//AVCaptureSessionPresetMedium,
|
||||
//AVCaptureSessionPresetLow,
|
||||
//AVCaptureSessionPresetPhoto,
|
||||
|
|
@ -1265,6 +1260,7 @@ static NSString *preset_names(NSString *preset)
|
|||
AVCaptureSessionPreset640x480:@"640x480",
|
||||
AVCaptureSessionPreset960x540:@"960x540",
|
||||
AVCaptureSessionPreset1280x720:@"1280x720",
|
||||
AVCaptureSessionPresetHigh:@"High",
|
||||
};
|
||||
NSString *name = preset_names[preset];
|
||||
if (name)
|
||||
|
|
@ -2080,11 +2076,15 @@ static obs_properties_t *av_capture_properties(void *capture)
|
|||
TEXT_DEVICE, OBS_COMBO_TYPE_LIST,
|
||||
OBS_COMBO_FORMAT_STRING);
|
||||
obs_property_list_add_string(dev_list, "", "");
|
||||
|
||||
for (AVCaptureDevice *dev in [AVCaptureDevice
|
||||
devicesWithMediaType:AVMediaTypeVideo]) {
|
||||
obs_property_list_add_string(dev_list,
|
||||
dev.localizedName.UTF8String,
|
||||
dev.uniqueID.UTF8String);
|
||||
devices]) {
|
||||
if ([dev hasMediaType: AVMediaTypeVideo] ||
|
||||
[dev hasMediaType: AVMediaTypeMuxed]) {
|
||||
obs_property_list_add_string(dev_list,
|
||||
dev.localizedName.UTF8String,
|
||||
dev.uniqueID.UTF8String);
|
||||
}
|
||||
}
|
||||
|
||||
obs_property_set_modified_callback(dev_list,
|
||||
|
|
@ -2178,6 +2178,20 @@ OBS_MODULE_USE_DEFAULT_LOCALE("mac-avcapture", "en-US")
|
|||
|
||||
bool obs_module_load(void)
|
||||
{
|
||||
#ifdef __MAC_10_10
|
||||
// Enable iOS device to show up as AVCapture devices
|
||||
// From WWDC video 2014 #508 at 5:34
|
||||
// https://developer.apple.com/videos/wwdc/2014/#508
|
||||
CMIOObjectPropertyAddress prop = {
|
||||
kCMIOHardwarePropertyAllowScreenCaptureDevices,
|
||||
kCMIOObjectPropertyScopeGlobal,
|
||||
kCMIOObjectPropertyElementMaster
|
||||
};
|
||||
UInt32 allow = 1;
|
||||
CMIOObjectSetPropertyData(kCMIOObjectSystemObject, &prop, 0, NULL,
|
||||
sizeof(allow), &allow);
|
||||
#endif
|
||||
|
||||
obs_source_info av_capture_info = {
|
||||
.id = "av_capture_input",
|
||||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
|
|
|
|||
6
plugins/mac-avcapture/data/locale/bn-BD.ini
Normal file
6
plugins/mac-avcapture/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
AVCapture="ভিডিও ক্যাপচার ডিভাইস"
|
||||
Device="ডিভাইস"
|
||||
Buffering="বাফারিং ব্যবহার করুন"
|
||||
VideoRange="ভিডিওর বিন্যাস"
|
||||
VideoRange.Partial="আংশিক"
|
||||
|
||||
|
|
@ -3,7 +3,7 @@ Device="Dispositiu"
|
|||
UsePreset="Usa els valors predefinits"
|
||||
Preset="Valors predefinits"
|
||||
Buffering="Usa memòria intermèdia"
|
||||
FrameRate="Quadres per segon"
|
||||
FrameRate="Fotogrames per segon"
|
||||
InputFormat="Format d'entrada"
|
||||
ColorSpace="Espai de color"
|
||||
VideoRange="Gamma de vídeo"
|
||||
|
|
|
|||
12
plugins/mac-capture/data/locale/bn-BD.ini
Normal file
12
plugins/mac-capture/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
CoreAudio.InputCapture="সব্দ গ্রেপ্তার"
|
||||
CoreAudio.OutputCapture="অডিও আউটপুট অধিগ্রহণ"
|
||||
DisplayCapture="অধিগ্রহণ প্রদর্শন করুন"
|
||||
DisplayCapture.Display="প্রদর্শন"
|
||||
WindowCapture.ShowShadow="উইণ্ডো ছায়া প্রদর্শন করুন"
|
||||
WindowUtils.Window="জানালা"
|
||||
WindowUtils.ShowEmptyNames="খালি নামের সাথে Windows প্রদর্শন করা হবে"
|
||||
CropMode.ToWindow="উইণ্ডো"
|
||||
CropMode.ToWindowAndManual="জানালা ও সহায়িকা"
|
||||
Crop.origin.x="বাকি ফসল"
|
||||
Crop.origin.y="ফসল শীর্ষে"
|
||||
|
||||
|
|
@ -10,8 +10,10 @@ WindowCapture.ShowShadow="Näita akna varju"
|
|||
WindowUtils.Window="Aken"
|
||||
WindowUtils.ShowEmptyNames="Kuva nimetuid aknaid"
|
||||
CropMode="Kärbi"
|
||||
CropMode.None="Pole"
|
||||
CropMode.None="Määramata"
|
||||
CropMode.Manual="Manuaalne"
|
||||
CropMode.ToWindow="Aknasse"
|
||||
CropMode.ToWindowAndManual="Aknasse ja manuaalselt"
|
||||
Crop.origin.x="Kärbi vasakult"
|
||||
Crop.origin.y="Kärbi ülevalt"
|
||||
Crop.size.width="Kärbi paremalt"
|
||||
|
|
|
|||
2
plugins/mac-capture/data/locale/hi-IN.ini
Normal file
2
plugins/mac-capture/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
CoreAudio.InputCapture="ऑडियो इनपुट पर कब्जा"
|
||||
|
||||
|
|
@ -798,7 +798,7 @@ struct obs_source_info coreaudio_output_capture_info = {
|
|||
.type = OBS_SOURCE_TYPE_INPUT,
|
||||
.output_flags = OBS_SOURCE_AUDIO |
|
||||
OBS_SOURCE_DO_NOT_DUPLICATE |
|
||||
OBS_SOURCE_DO_NOT_MONITOR,
|
||||
OBS_SOURCE_DO_NOT_SELF_MONITOR,
|
||||
.get_name = coreaudio_output_getname,
|
||||
.create = coreaudio_create_output_capture,
|
||||
.destroy = coreaudio_destroy,
|
||||
|
|
|
|||
8
plugins/mac-syphon/data/locale/bn-BD.ini
Normal file
8
plugins/mac-syphon/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
Syphon="খেলার অধিগ্রহণ (Syphon)"
|
||||
Source="উৎস"
|
||||
Application="অ্যাপ্লিকেশন"
|
||||
SyphonLicense="Syphon লাইসেন্স"
|
||||
Crop.origin.y="ফসল শীর্ষে"
|
||||
Crop.size.width="তাই ফসল"
|
||||
Crop.size.height="ফসল তলায়"
|
||||
|
||||
2
plugins/mac-syphon/data/locale/hi-IN.ini
Normal file
2
plugins/mac-syphon/data/locale/hi-IN.ini
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Syphon="खेल पर कब्जा खेल (Syphon)"
|
||||
|
||||
8
plugins/mac-vth264/data/locale/bn-BD.ini
Normal file
8
plugins/mac-vth264/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
VTH264EncHW="আপেল ভিটি H264 হার্ডওয়্যার এনকোডার"
|
||||
VTH264EncSW="আপেল ভিটি H264 সফটওয়্যার এনকোডার"
|
||||
Bitrate="বিটরেট"
|
||||
UseMaxBitrate="সীমা সর্বাধিক বিটের হার।"
|
||||
Profile="প্রোফাইল"
|
||||
None="(একটিও না)"
|
||||
|
||||
|
||||
|
|
@ -4,6 +4,8 @@ VTEncoder="VideoToolbox kodeerija"
|
|||
Bitrate="Bitikiirus"
|
||||
UseMaxBitrate="Piira bitikiirust"
|
||||
MaxBitrate="Maksimaalne bitikiirus"
|
||||
MaxBitrateWindow="Maksimaalne Bitikiiruse aken (sekundit)"
|
||||
KeyframeIntervalSec="Võtmekaadri intervall (sekundit, 0=automaatne)"
|
||||
Profile="Profiil"
|
||||
None="(Määramata)"
|
||||
DefaultEncoder="(Vaikekodeering)"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ VTEncoder="VideoToolbox Kodlayıcı"
|
|||
Bitrate="Bit hızı"
|
||||
UseMaxBitrate="Bit hızını sınırla"
|
||||
MaxBitrate="Maksimum bit hızı"
|
||||
MaxBitrateWindow="Maksimum bit hızı penceresi (saniye)"
|
||||
KeyframeIntervalSec="Anahtar Kare Aralığı (saniye, 0=otomatik)"
|
||||
Profile="Profil"
|
||||
None="(Yok)"
|
||||
|
|
|
|||
|
|
@ -1,3 +1,13 @@
|
|||
None="(Ingen)"
|
||||
VTH264EncHW="Bộ mã hóa Apple VT H264 bằng phần cứng"
|
||||
VTH264EncSW="Bộ mã hóa Apple VT H264 bằng phần mềm"
|
||||
VTEncoder="Bộ mã hóa VideoToolbox"
|
||||
Bitrate="Bitrate"
|
||||
UseMaxBitrate="Giới hạn bitrate"
|
||||
MaxBitrate="Bitrate tối đa"
|
||||
KeyframeIntervalSec="Thời gian đặt Keyframe (giây, 0=tự động)"
|
||||
Profile="Hồ sơ"
|
||||
None="(Không)"
|
||||
DefaultEncoder="(Bộ mã hóa mặc định)"
|
||||
UseBFrames="Sử dụng B-Frame"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ add_library(obs-ffmpeg MODULE
|
|||
${obs-ffmpeg_SOURCES})
|
||||
target_link_libraries(obs-ffmpeg
|
||||
libobs
|
||||
libff
|
||||
media-playback
|
||||
${obs-ffmpeg_PLATFORM_DEPS}
|
||||
${FFMPEG_LIBRARIES})
|
||||
|
||||
|
|
|
|||
|
|
@ -14,13 +14,11 @@ FFmpegSource="مصدر وسائط"
|
|||
LocalFile="ملف محلي"
|
||||
Looping="تكرار حلقي"
|
||||
Advanced="متقدم"
|
||||
DiscardNone="لا شيء"
|
||||
ColorRange="نطاق ألوان YUV"
|
||||
ColorRange.Auto="تلقائي"
|
||||
ColorRange.Partial="جزئي"
|
||||
ColorRange.Full="كامل"
|
||||
|
||||
|
||||
MediaFileFilter.AllMediaFiles="كافة ملفات الوسائط"
|
||||
MediaFileFilter.VideoFiles="ملفات الفيديو"
|
||||
MediaFileFilter.AudioFiles="ملفات الصوت"
|
||||
|
|
|
|||
|
|
@ -6,4 +6,3 @@ Bitrate="Битрейт"
|
|||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
18
plugins/obs-ffmpeg/data/locale/bn-BD.ini
Normal file
18
plugins/obs-ffmpeg/data/locale/bn-BD.ini
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
FFmpegOutput="FFmpeg উত্পাদন"
|
||||
FFmpegAAC="পূর্ব-নির্ধারিত FFmpeg AAC এনকোডার"
|
||||
Preset="পূর্ব-নির্ধারিত"
|
||||
RateControl="হার নিয়ন্ত্রণ"
|
||||
|
||||
BFrames="বি-ফ্রেম"
|
||||
|
||||
NVENC.Use2Pass="দুই পাসে এনকোডিং ব্যবহার করো"
|
||||
NVENC.Preset.default="পূর্ব-নির্ধারিত"
|
||||
NVENC.Preset.ll="লো-সুপ্ত"
|
||||
NVENC.Preset.llhq="উচ্চ মান নিম্ন-সুপ্ত"
|
||||
NVENC.Preset.llhp="লো-সুপ্ত উচ্চ কার্যক্ষমতা"
|
||||
NVENC.Level="শ্রেনী"
|
||||
|
||||
FFmpegSource="মিডিয়া উৎস"
|
||||
|
||||
|
||||
|
||||
|
|
@ -23,27 +23,15 @@ LocalFile="Fitxer local"
|
|||
Looping="Bucle"
|
||||
Input="Entrada"
|
||||
InputFormat="Format d'entrada"
|
||||
ForceFormat="Força la conversió de format"
|
||||
HardwareDecode="Usa la descodificació per maquinari si és disponible"
|
||||
ClearOnMediaEnd="Amaga l'origen en acabar la reproducció"
|
||||
Advanced="Avançat"
|
||||
AudioBufferSize="Mida de la memòria intermèdia d'àudio (em fotogrames)"
|
||||
VideoBufferSize="Mida de la memòria intermèdia de vídeo (en fotogrames)"
|
||||
FrameDropping="Nivell de pèrdua de quadres"
|
||||
DiscardNone="Cap"
|
||||
DiscardDefault="Per defecte (paquets invàlids)"
|
||||
DiscardNonRef="Quadres de no-referència"
|
||||
DiscardBiDir="Quadres bidireccionals"
|
||||
DiscardNonIntra="Quadres no-interiors"
|
||||
DiscardNonKey="Quadres no-clau"
|
||||
DiscardAll="Tots els marcs (aneu amb compte!)"
|
||||
RestartWhenActivated="Reinicia la reproducció quan la font estigui activa"
|
||||
ColorRange="Gamma de color YUV"
|
||||
ColorRange.Auto="Automàtic"
|
||||
ColorRange.Partial="Parcial"
|
||||
ColorRange.Full="Màxim"
|
||||
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Tots els arxius multimèdia"
|
||||
MediaFileFilter.VideoFiles="Arxius de vídeo"
|
||||
MediaFileFilter.AudioFiles="Arxius d'àudio"
|
||||
|
|
|
|||
|
|
@ -23,26 +23,17 @@ LocalFile="Místní soubor"
|
|||
Looping="Opakovat"
|
||||
Input="Vstup"
|
||||
InputFormat="Formát vstupu"
|
||||
ForceFormat="Nařídit převod formátu"
|
||||
HardwareDecode="Použít hardwarové dekódování, pokud je k dispozici"
|
||||
ClearOnMediaEnd="Skrýt zdroj po skončení přehrávání"
|
||||
Advanced="Pokročilé"
|
||||
AudioBufferSize="Velikost bufferu zvuku (snímky)"
|
||||
VideoBufferSize="Velikost bufferu videa (snímky)"
|
||||
FrameDropping="Úroveň ztrácení snímků"
|
||||
DiscardNone="Žádné"
|
||||
DiscardDefault="Výchozí (chybné packety)"
|
||||
DiscardNonRef="Snímky bez reference"
|
||||
DiscardBiDir="Oboustranné snímky"
|
||||
DiscardNonIntra="Snímky mimo rámec"
|
||||
DiscardNonKey="Ne-klíčové snímky"
|
||||
DiscardAll="Všechny snímky (Pozor!)"
|
||||
RestartWhenActivated="Restartovat přehrávání poté, co je zdroj aktivován"
|
||||
CloseFileWhenInactive="Zavřít soubor při neaktivitě"
|
||||
CloseFileWhenInactive.ToolTip="Uzavře soubor poté, co již není zdroj zobrazen ve vysílání či\nnahrávání. Toto umožňuje, aby byl tento soubor změněn, když není zdroj aktivní,\nale může dojít ke prodlení při znovu aktivaci zdroje."
|
||||
ColorRange="Rozsah barev YUV"
|
||||
ColorRange.Auto="Automatický"
|
||||
ColorRange.Partial="Částečný"
|
||||
ColorRange.Full="Celkový"
|
||||
|
||||
RestartMedia="Restartovat mediální zdroj"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Všechny mediální soubory"
|
||||
MediaFileFilter.VideoFiles="Video soubory"
|
||||
|
|
|
|||
|
|
@ -23,26 +23,17 @@ LocalFile="Lokal fil"
|
|||
Looping="Gentagelse"
|
||||
Input="Input"
|
||||
InputFormat="Input format"
|
||||
ForceFormat="Gennemtving-formatkonvertering"
|
||||
HardwareDecode="Brug hardwareafkodning når tilgængelige"
|
||||
ClearOnMediaEnd="Skjul kilde når afspilning slutter"
|
||||
Advanced="Avanceret"
|
||||
AudioBufferSize="Audio bufferstørrelse (frames)"
|
||||
VideoBufferSize="Video bufferstørrelse (frames)"
|
||||
FrameDropping="Billedtabsniveau"
|
||||
DiscardNone="Ingen"
|
||||
DiscardDefault="Standard (ugyldige pakker)"
|
||||
DiscardNonRef="Ikke-reference billeder"
|
||||
DiscardBiDir="Tovejs frames"
|
||||
DiscardNonIntra="Non-Intra frames"
|
||||
DiscardNonKey="Non-Key Frames"
|
||||
DiscardAll="Alle frames (pas på!)"
|
||||
RestartWhenActivated="Genstart afspilning når kilde bliver aktiv"
|
||||
CloseFileWhenInactive="Luk fil når inaktiv"
|
||||
CloseFileWhenInactive.ToolTip="Lukker filen, når kilden ikke vises i streamen ellerr\noptagelsen. Dette muliggør at filen kan ændres, når kilden er ikke aktiv, \nmen der kan være noget opstartsforsinkelse, når kilden genaktiveres."
|
||||
ColorRange="YUV-farveområde"
|
||||
ColorRange.Auto="Auto"
|
||||
ColorRange.Partial="Delvis"
|
||||
ColorRange.Full="Fuld"
|
||||
|
||||
RestartMedia="Genstart Media"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Alle mediefiler"
|
||||
MediaFileFilter.VideoFiles="Videofiler"
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ Lossless="Verlustfrei"
|
|||
|
||||
BFrames="B-frames"
|
||||
|
||||
NVENC.Use2Pass="Benutze Two-Pass Encoding"
|
||||
NVENC.Use2Pass="Benutze Two-Pass Codierung"
|
||||
NVENC.Preset.default="Standard"
|
||||
NVENC.Preset.hq="Hohe Qualität"
|
||||
NVENC.Preset.hp="Hohe Leistung"
|
||||
|
|
@ -23,26 +23,17 @@ LocalFile="Lokale Datei"
|
|||
Looping="Endlosschleife"
|
||||
Input="Eingabe"
|
||||
InputFormat="Eingabeformat"
|
||||
ForceFormat="Erzwinge Formatkonvertierung"
|
||||
HardwareDecode="Verwende Hardwaredecodierung, falls verfügbar"
|
||||
ClearOnMediaEnd="Quelle verbergen, wenn Wiedergabe endet"
|
||||
Advanced="Erweitert"
|
||||
AudioBufferSize="Audiopuffergröße (Frames)"
|
||||
VideoBufferSize="Videopuffergröße (Frames)"
|
||||
FrameDropping="Frame Dropping Level"
|
||||
DiscardNone="Keine"
|
||||
DiscardDefault="Standard (ungültige Pakete)"
|
||||
DiscardNonRef="Non-Reference Frames"
|
||||
DiscardBiDir="Bi-Directional Frames"
|
||||
DiscardNonIntra="Non-Intra Frames"
|
||||
DiscardNonKey="Non-Key Frames"
|
||||
DiscardAll="Alle Frames (Vorsicht!)"
|
||||
RestartWhenActivated="Wiedergabe erneut starten, wenn Quelle aktiviert wird"
|
||||
CloseFileWhenInactive="Datei schließen, wenn inaktiv"
|
||||
CloseFileWhenInactive.ToolTip="Schließt die Datei, wenn die Quelle im Stream oder der Aufnahme nicht angezeigt wird.\n Dies ermöglicht, dass die Datei geändert wird, wenn die Quelle nicht aktiv ist,\n aber es gibt wahrscheinlich etwas Starverzögerung, wenn die Quelle reaktiviert wird."
|
||||
ColorRange="YUV-Farbmatrix"
|
||||
ColorRange.Auto="Automatisch"
|
||||
ColorRange.Partial="Teilweise"
|
||||
ColorRange.Full="Voll"
|
||||
|
||||
RestartMedia="Medium neu starten"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Alle Mediendateien"
|
||||
MediaFileFilter.VideoFiles="Video-Dateien"
|
||||
|
|
|
|||
|
|
@ -9,15 +9,9 @@ LocalFile="Τοπικό αρχείο"
|
|||
Looping="Επανάληψη"
|
||||
Input="Είσοδος"
|
||||
InputFormat="Μορφή Εισόδου"
|
||||
ForceFormat="Εξαναγκασμός μετατροπής μορφής"
|
||||
HardwareDecode="Χρήση αποκωδικοποίησης υλικού όταν είναι διαθέσιμη"
|
||||
ClearOnMediaEnd="Απόκρυψη πηγής όταν τελειώνει η αναπαραγωγή"
|
||||
Advanced="Σύνθετες επιλογές"
|
||||
FrameDropping="Επίπεδο Ρίψης Καρέ"
|
||||
DiscardNone="Κανένα"
|
||||
DiscardDefault="Προεπιλογή (άκυρα πακέτα)"
|
||||
DiscardAll="Όλα τα καρέ (Προσοχή!)"
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -23,26 +23,18 @@ LocalFile="Local File"
|
|||
Looping="Loop"
|
||||
Input="Input"
|
||||
InputFormat="Input Format"
|
||||
ForceFormat="Force format conversion"
|
||||
BufferingMB="Network Buffering (MB)"
|
||||
HardwareDecode="Use hardware decoding when available"
|
||||
ClearOnMediaEnd="Hide source when playback ends"
|
||||
Advanced="Advanced"
|
||||
AudioBufferSize="Audio Buffer Size (frames)"
|
||||
VideoBufferSize="Video Buffer Size (frames)"
|
||||
FrameDropping="Frame Dropping Level"
|
||||
DiscardNone="None"
|
||||
DiscardDefault="Default (Invalid Packets)"
|
||||
DiscardNonRef="Non-Reference Frames"
|
||||
DiscardBiDir="Bi-Directional Frames"
|
||||
DiscardNonIntra="Non-Intra Frames"
|
||||
DiscardNonKey="Non-Key Frames"
|
||||
DiscardAll="All Frames (Careful!)"
|
||||
RestartWhenActivated="Restart playback when source becomes active"
|
||||
CloseFileWhenInactive="Close file when inactive"
|
||||
CloseFileWhenInactive.ToolTip="Closes the file when the source is not being displayed on the stream or\nrecording. This allows the file to be changed when the source isn't active,\nbut there may be some startup delay when the source reactivates."
|
||||
ColorRange="YUV Color Range"
|
||||
ColorRange.Auto="Auto"
|
||||
ColorRange.Partial="Partial"
|
||||
ColorRange.Full="Full"
|
||||
|
||||
RestartMedia="Restart Media"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="All Media Files"
|
||||
MediaFileFilter.VideoFiles="Video Files"
|
||||
|
|
|
|||
|
|
@ -23,26 +23,17 @@ LocalFile="Archivo local"
|
|||
Looping="Bucle"
|
||||
Input="Entrada"
|
||||
InputFormat="Formato de entrada"
|
||||
ForceFormat="Forzar la conversión de formato"
|
||||
HardwareDecode="Utilizar la decodificación por hardware cuando esté disponible"
|
||||
ClearOnMediaEnd="Ocultar la fuente cuando finaliza la reproducción"
|
||||
Advanced="Avanzado"
|
||||
AudioBufferSize="Tamaño del buffer de audio (cuadros)"
|
||||
VideoBufferSize="Tamaño del buffer de vídeo (cuadros)"
|
||||
FrameDropping="Nivel de omisión de cuadros"
|
||||
DiscardNone="Ninguno"
|
||||
DiscardDefault="Por defecto (paquetes no válidos)"
|
||||
DiscardNonRef="Fotogramas referenciar"
|
||||
DiscardBiDir="Fotogramas bidireccionales"
|
||||
DiscardNonIntra="Fotogramas no intra-frame"
|
||||
DiscardNonKey="Fotogramas no claves"
|
||||
DiscardAll="Todos los fotogramas (¡Cuidado!)"
|
||||
RestartWhenActivated="Reiniciar la reproducción cuando la fuente esté activa"
|
||||
CloseFileWhenInactive="Cerrar archivo cuando esté inactivo"
|
||||
CloseFileWhenInactive.ToolTip="Cierra el archivo cuando la fuente no esta siendo mostrada en el directo o en la grabación.\nEsto permite que el archivo pueda ser cambiado cuando la fuente no esta activa,\npero puede haber una espera en el inicio cuando se reactive la fuente."
|
||||
ColorRange="Gama de Color YUV"
|
||||
ColorRange.Auto="Automatico"
|
||||
ColorRange.Partial="Parcial"
|
||||
ColorRange.Full="Completo"
|
||||
|
||||
RestartMedia="Reiniciar Medio"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Todos los archivos multimedia"
|
||||
MediaFileFilter.VideoFiles="Archivos de vídeo"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,12 @@
|
|||
FFmpegOutput="FFmpeg väljund"
|
||||
FFmpegAAC="FFmpeg vaike AAC kodeerija"
|
||||
Bitrate="Bitikiirus"
|
||||
Preset="Eelseadistus"
|
||||
KeyframeIntervalSec="Võtmekaadri intervall (sekundit, 0=automaatne)"
|
||||
Lossless="Kadudeta"
|
||||
|
||||
|
||||
NVENC.Use2Pass="Kasuta Two-Pass kodeeringut"
|
||||
NVENC.Preset.default="Vaikimisi"
|
||||
NVENC.Preset.hq="Kõrge kvaliteet"
|
||||
NVENC.Preset.hp="Suur jõudlus"
|
||||
|
|
@ -17,13 +22,12 @@ Looping="Korda"
|
|||
Input="Sisend"
|
||||
InputFormat="Sisestus formaat"
|
||||
ClearOnMediaEnd="Peida allikas kui taasesitus lõppeb"
|
||||
AudioBufferSize="Audio puhvri suurus (kaadrit)"
|
||||
RestartWhenActivated="Taaskäivita taasesitus, kui allikas muutub aktiivseks"
|
||||
ColorRange="YUV värviruumi vahemik"
|
||||
ColorRange.Auto="Automaatne"
|
||||
ColorRange.Partial="Osaline"
|
||||
ColorRange.Full="Täielik"
|
||||
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Kõik meediumifailid"
|
||||
MediaFileFilter.VideoFiles="Videofailid"
|
||||
MediaFileFilter.AudioFiles="Helifailid"
|
||||
|
|
|
|||
|
|
@ -23,26 +23,17 @@ LocalFile="Tokiko fitxategia"
|
|||
Looping="Begizta"
|
||||
Input="Sarrera"
|
||||
InputFormat="Sarrera formatua"
|
||||
ForceFormat="Behartu formatu-bihurketa"
|
||||
HardwareDecode="Erabili hardware deskodeketa eskuragarri dagoenean"
|
||||
ClearOnMediaEnd="Ezkutatu iturburua erreprodukzioa amaitzean"
|
||||
Advanced="Aurreratua"
|
||||
AudioBufferSize="Audio-bufferraren tamaina (fotogramak)"
|
||||
VideoBufferSize="Bideo-bufferraren tamaina (fotogramak)"
|
||||
FrameDropping="Fotogramen erorketa maila"
|
||||
DiscardNone="Ezer ez"
|
||||
DiscardDefault="Lehenetsia (pakete baliogabeak)"
|
||||
DiscardNonRef="Erreferentziarik gabeko fotogramak"
|
||||
DiscardBiDir="Norabide biko fotogramak"
|
||||
DiscardNonIntra="Non-Intra fotogramak"
|
||||
DiscardNonKey="Gakoa ez diren fotogramak"
|
||||
DiscardAll="Fotograma guztiak (kontuz!)"
|
||||
RestartWhenActivated="Berrabiarazi erreprodukzioa iturburua aktiboa dagoenean"
|
||||
CloseFileWhenInactive="Itxi fitxategia inaktibo dagoenean"
|
||||
CloseFileWhenInactive.ToolTip="Itxi fitxategia iturburua ez bada bistaratzen transmisioan edo\ngrabazioan. Honi esker fitxategia alda daiteke iturburua aktiboa ez badago,\nbaina atzerapen bat sor daiteke iturburua biraktibatzean."
|
||||
ColorRange="YUV kolore-barrutia"
|
||||
ColorRange.Auto="Auto"
|
||||
ColorRange.Partial="Partziala"
|
||||
ColorRange.Full="Osoa"
|
||||
|
||||
RestartMedia="Berrabiarazi euskarria"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Multimedia-fitxategi guztiak"
|
||||
MediaFileFilter.VideoFiles="Bideo-fitxategiak"
|
||||
|
|
|
|||
|
|
@ -23,26 +23,17 @@ LocalFile="Paikallinen tiedosto"
|
|||
Looping="Toista jatkuvasti"
|
||||
Input="Sisääntulo"
|
||||
InputFormat="Sisääntulon muoto"
|
||||
ForceFormat="Pakota muodon muuntaminen"
|
||||
HardwareDecode="Käytä laitteistotason purkua, kun mahdollista"
|
||||
ClearOnMediaEnd="Piilota lähde kun toisto päättyy"
|
||||
Advanced="Lisäasetukset"
|
||||
AudioBufferSize="Äänipuskurin koko (ruutua)"
|
||||
VideoBufferSize="Videopuskurin koko (ruutua)"
|
||||
FrameDropping="Frame Dropping -taso"
|
||||
DiscardNone="Ei mikään"
|
||||
DiscardDefault="Oletus (virheelliset paketit)"
|
||||
DiscardNonRef="Non-Reference Frames"
|
||||
DiscardBiDir="Bi-Directional Frames"
|
||||
DiscardNonIntra="Non-Intra Frames"
|
||||
DiscardNonKey="Non-Key Frames"
|
||||
DiscardAll="All Frames (Varoitus!)"
|
||||
RestartWhenActivated="Aloita toisto uudelleen kun lähde aktivoituu"
|
||||
CloseFileWhenInactive="Sulje tiedosto, kun toimeton"
|
||||
CloseFileWhenInactive.ToolTip="Sulkee tiedoston kun lähdettä ei näytetä lähetyksessä tai nauhoituksessa.\nTämä mahdollistaa tiedoston muuttamisen kun lähde ei ole aktiivinen,\nmutta se saattaa aiheuttaa pientä viivettä käynnistyksessä kun tiedosto aktivoituu uudelleen."
|
||||
ColorRange="YUV värialue"
|
||||
ColorRange.Auto="Automaattinen"
|
||||
ColorRange.Partial="Osittainen"
|
||||
ColorRange.Full="Täysi"
|
||||
|
||||
RestartMedia="Uudelleenkäynnistä media"
|
||||
|
||||
MediaFileFilter.AllMediaFiles="Kaikki mediatiedostot"
|
||||
MediaFileFilter.VideoFiles="Videotiedostot"
|
||||
|
|
|
|||
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